本文目录导读:

这个问题问得很好,运维工程师的核心工作就是“自动化一切”,一个好的脚本可以大大减少重复劳动、避免人为错误。
以下分类整理了运维工程师最常用、最实用的脚本场景和具体实现思路,涵盖 Shell 和 Python 两种主流语言。
第一类:系统监控与巡检(日常任务)
这类脚本通常由 crontab 定时触发,发送告警或生成报告。
-
磁盘空间监控
- 场景:当磁盘使用率超过阈值(如 80%)时,自动清理日志或发送告警。
- Shell 极简版:
#!/bin/bash threshold=80 df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $1}' | while read output; do usage=$(echo $output | awk '{print $1}' | sed 's/%//g') partition=$(echo $output | awk '{print $2}') if [ $usage -ge $threshold ]; then echo "Warning: $partition is at ${usage}%" # 可以在这里添加 curl 或 mail 命令发送警报 fi done
-
服务进程存活检查
- 场景:确保 Nginx、MySQL、Redis 等核心服务一直在运行,如果挂了自动重启。
- Shell 版:
#!/bin/bash service_name="nginx" if ! pgrep -x "$service_name" > /dev/null; then echo "$service_name is down. Attempting restart..." systemctl restart $service_name # 记录日志 echo "$(date): $service_name restarted" >> /var/log/service_check.log fi
-
日志分析和错误告警
- 场景:实时监控应用日志,发现 ERROR 或 FATAL 关键字立即通知。
- Shell 版(结合 tail 和 grep):
tail -F /var/log/app/error.log | while read line; do if echo "$line" | grep -iE "error|fatal|exception"; then echo "ALERT: $line" # 发送到钉钉/飞书/微信机器人 curl -X POST -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"'"$line"'"}}' http://your-webhook-url fi done
第二类:自动化部署与配置(DevOps 效率)
这是运维脚本的核心价值,能极大提升发布效率。
-
代码发布脚本
-
场景:从 Git 拉取代码,执行构建,备份旧版本,切换到新版本,平滑重启服务。
-
Shell 重点代码段:
#!/bin/bash PROJECT_DIR="/app/web" BACKUP_DIR="/backup/web" BRANCH="main" DATE=$(date +%Y%m%d%H%M%S) # 1. 进入目录,拉取最新代码 cd $PROJECT_DIR || exit git pull origin $BRANCH # 2. 备份当前版本(可选) cp -r $PROJECT_DIR $BACKUP_DIR/web_$DATE # 3. 执行构建(如果是前端项目) npm install && npm run build # 4. 复制构建产物到服务目录(如果目录结构不同) cp -r dist/* /var/www/html/ # 5. 重启 Nginx(确保无语法错误) nginx -t && systemctl reload nginx echo "Deployment completed at $DATE"
-
-
批量远程操作脚本(SSH 免密)
- 场景:对 100 台服务器执行同样的命令(如更新 hosts 文件、安装 agent)。
- Shell 版(基于循环):
#!/bin/bash # 假设在 server_list.txt 文件中,每行一个 IP for host in $(cat server_list.txt) do echo "=== Operating on $host ===" ssh -o StrictHostKeyChecking=no root@$host "systemctl restart network; echo 'Done on $host'" done - 更专业的替代:推荐使用
ansible或pssh,但纯 Shell 脚本在无 Python 环境时非常有用。
第三类:数据备份与恢复(容灾)
-
MySQL 数据库分库备份
-
场景:每天凌晨备份所有数据库,每个库存成一个文件,并保留最近 7 天。
-
Shell 版:
#!/bin/bash DB_USER="root" DB_PASS="your_password" BACKUP_DIR="/backup/mysql" DATE=$(date +%Y-%m-%d) RETENTION_DAYS=7 mkdir -p $BACKUP_DIR/$DATE # 获取所有数据库列表(排除系统库) databases=$(mysql -u$DB_USER -p$DB_PASS -e "SHOW DATABASES;" | grep -Ev "Database|information_schema|performance_schema|mysql|sys") for db in $databases; do echo "Backing up $db..." mysqldump -u$DB_USER -p$DB_PASS --single-transaction --routines --triggers --events $db | gzip > $BACKUP_DIR/$DATE/${db}.sql.gz done # 删除7天前的备份 find $BACKUP_DIR/* -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \; echo "Backup completed at $(date)"
-
-
大文件上传备份到对象存储
-
场景:备份包太大,本地放不下,自动上传到阿里云 OSS / 腾讯云 COS / AWS S3。
-
Python 版(使用 boto3):
import os import boto3 from botocore.client import Config # 配置 ACCESS_KEY = 'your_key' SECRET_KEY = 'your_secret' ENDPOINT = 'https://oss-cn-hangzhou.aliyuncs.com' # 示例 BUCKET_NAME = 'my-backup-bucket' LOCAL_FILE = '/backup/db_backup.sql.gz' REMOTE_FILE = 'backups/db_backup_$(date +%Y%m%d).sql.gz' # 上传 client = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, endpoint_url=ENDPOINT, config=Config(signature_version='s3v4')) try: client.upload_file(LOCAL_FILE, BUCKET_NAME, REMOTE_FILE) print(f"Successfully uploaded {LOCAL_FILE} to {BUCKET_NAME}/{REMOTE_FILE}") except Exception as e: print(f"Upload failed: {e}")
-
第四类:网络与安全辅助
-
批量端口扫描
-
场景:巡检防火墙有没有漏开放端口,或者检查服务器监听了哪些端口。
-
Shell 版:
#!/bin/bash NETWORK="192.168.1" PORTS="22,80,443,3306,6379" for i in {1..254} do host="$NETWORK.$i" echo "Scanning $host..." for port in $(echo $PORTS | tr ',' ' '); do timeout 1 bash -c "echo >/dev/tcp/$host/$port" 2>/dev/null && \ echo "$host:$port is open" done done -
更专业的替代:
nmap或masscan。
-
-
IP 黑白名单管理
-
场景:发现恶意 IP,通过脚本快速添加 iptables 或 firewalld 规则。
-
Shell 版:
#!/bin/bash # 用法: ./block_ip.sh 192.168.1.100 IP_TO_BLOCK=$1 if [ -z "$IP_TO_BLOCK" ]; then echo "Usage: $0 <IP>" exit 1 fi # 检查是否已存在规则 if ! iptables -C INPUT -s $IP_TO_BLOCK -j DROP 2>/dev/null; then iptables -A INPUT -s $IP_TO_BLOCK -j DROP echo "Blocked $IP_TO_BLOCK" else echo "$IP_TO_BLOCK already blocked" fi # 保存规则(不同系统命令不同) iptables-save > /etc/iptables/rules.v4
-
第五类:日志与数据处理(分析)
-
Nginx 访问日志 Top N 分析
-
场景:快速找出访问量最大的 IP、请求最多的 URL、最耗时的接口。
-
Shell 一行流:
# 访问量最大的 Top 10 IP awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 # 访问量最大的 Top 10 URL awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 # 响应时间超过 5 秒的请求 awk '$NF > 5 {print $7, $NF}' /var/log/nginx/access.log | sort -k2 -nr | head -20
-
-
配置备份与版本对比
- 场景:修改配置文件前自动备份,并在下次修改时提示差异。
- Shell 函数(在 .bashrc 中定义):
backup_config() { if [ -f "$1" ]; then cp "$1" "$1.bak.$(date +%Y%m%d_%H%M%S)" echo "Backup of $1 created." else echo "File $1 not found." fi } # 用法:backup_config /etc/nginx/nginx.conf
推荐脚本开发习惯
-
使用 Bash 时,加上这行防出错:
set -euo pipefail
-e:遇到错误立即退出。-u:使用未定义变量时报错。-o pipefail:管道中任何一步失败都算失败。
-
复杂的逻辑用 Python:当需要处理 JSON/YAML/Excel、调用 API、进行复杂条件判断时,Python 的可读性和标准库(
json,requests,os,re)更适合。 -
复用原则:把通用函数(如日志记录、发送通知、API 调用)封装成单独的
lib.sh或utils.py文件,用source lib.sh(Shell)或from utils import send_alert(Python)引入。
一个优秀的运维脚本,应当是 幂等 的(运行多次结果一样)、可重试 的、有良好日志 的。
建议先从以下 三个高频场景 开始自己动手写:
- 监控脚本(磁盘 + 进程 -> crontab 运行)
- 备份脚本(数据库 -> 云端 -> crontab 运行)
- 发布脚本(Git -> 备份 -> 重启 -> 回滚)
把这些基础脚本写好、打磨稳定,日常运维效率至少提升 70%。