作为IT工程师,掌握高效的Shell脚本能极大提升运维效率。以下是34个实用脚本分类整理,附带使用场景和注意事项:
一、系统监控类 1. CPU监控脚本
#!/bin/bash
cpu_threshold=80
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
if (( $(echo "$cpu_usage > $cpu_threshold" | bc -l) )); then
echo "警报: CPU使用率 ${cpu_usage}% > ${cpu_threshold}% $(date)" >> /var/log/system_monitor.log
# 可添加邮件报警功能
fi
#!/bin/bash
mem_threshold=90
mem_usage=$(free | grep Mem | awk '{print ($3-$7-$6)/$2 * 100}')
if (( $(echo "$mem_usage > $mem_threshold" | bc -l) )); then
echo "警报: 内存使用率 ${mem_usage}% > ${mem_threshold}% $(date)" >> /var/log/system_monitor.log
# 自动清理缓存
sync; echo 3 > /proc/sys/vm/drop_caches
fi
二、日志分析类 3. Nginx 404错误统计
#!/bin/bash
log_path=/var/log/nginx/access.log
error_codes=("404" "500")
for code in ${error_codes[@]}; do
count=$(grep -o "HTTP/1.1\" $code" $log_path | wc -l)
echo "[$(date)] 状态码 $code 出现次数: $count" >> /var/log/nginx_error_report.log
done
#!/bin/bash
LOG_DIR=/var/log/myapp
MAX_SIZE=10M
MAX_DAYS=30
find $LOG_DIR -name "*.log" -size +$MAX_SIZE -exec gzip {} \;
find $LOG_DIR -name "*.gz" -mtime +$MAX_DAYS -exec rm -f {} \;
三、备份恢复类 5. MySQL全量备份(带压缩)
#!/bin/bash
BACKUP_DIR=/backup/mysql
DATE=$(date +%Y%m%d)
USER="root"
PASS="password"
mysqldump -u$USER -p$PASS --all-databases | gzip > $BACKUP_DIR/full_backup_$DATE.sql.gz
find $BACKUP_DIR -mtime +7 -name "*.gz" -exec rm {} \;
#!/bin/bash
SOURCE_DIR=/data/
BACKUP_DIR=/backup/data/
LOG_FILE=/var/log/backup_rsync.log
rsync -avz --delete --log-file=$LOG_FILE $SOURCE_DIR $BACKUP_DIR
四、安全加固类 7. SSH失败登录检测
#!/bin/bash
FAILED_LOGINS=$(grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr)
echo "SSH登录失败统计:"
echo "$FAILED_LOGINS" | while read count ip; do
if [ $count -gt 3 ]; then
echo "封禁IP: $ip (尝试次数: $count)"
iptables -A INPUT -s $ip -j DROP
fi
done
#!/bin/bash
CHECK_FILE="/etc/passwd"
SAVED_HASH="/root/.passwd.md5"
if [ ! -f $SAVED_HASH ]; then
md5sum $CHECK_FILE > $SAVED_HASH
exit 0
fi
if ! md5sum -c --quiet $SAVED_HASH; then
echo "警告: $CHECK_FILE 文件已被修改!" | mail -s "文件完整性警报" admin@example.com
fi
五、网络管理类 9. 端口连通性测试
#!/bin/bash
target_host="example.com"
ports=(22 80 443 3306)
for port in ${ports[@]}; do
timeout 1 bash -c "echo >/dev/tcp/$target_host/$port" 2>/dev/null &&
echo "端口 $port 开放" ||
echo "端口 $port 关闭"
done
#!/bin/bash
domain_list=("google.com" "github.com" "example.com")
dns_server="8.8.8.8"
for domain in ${domain_list[@]}; do
echo "解析 $domain :"
dig @$dns_server $domain +short
done
六、自动化运维类 11. 批量主机SSH命令执行
#!/bin/bash
HOSTS=("server1" "server2" "192.168.1.100")
COMMAND="df -h"
for host in ${HOSTS[@]}; do
echo "==== $host ===="
ssh -o ConnectTimeout=5 $host "$COMMAND"
done
#!/bin/bash
SERVICE="nginx"
if systemctl is-active --quiet $SERVICE; then
echo "$SERVICE 正在运行"
else
echo "尝试重启 $SERVICE..."
systemctl restart $SERVICE
sleep 5
if systemctl is-active --quiet $SERVICE; then
echo "重启成功"
else
echo "重启失败,发送警报"
fi
fi
七、实用工具类 13. 进度条显示(用于长时间操作)
#!/bin/bash
function progress_bar {
duration=$1
interval=1
steps=$((duration/interval))
for ((i=0; i<=steps; i++)); do
percent=$((100*i/steps))
printf "[%-100s] %d%%\r" $(printf '#%.0s' $(seq 1 $percent)) $percent
sleep $interval
done
echo
}
progress_bar 10 # 示例:显示10秒进度条
#!/bin/bash
DIR="/data/images"
PREFIX="photo_"
COUNT=1
for file in $DIR/*; do
if [ -f "$file" ]; then
ext=${file##*.}
mv "$file" "$DIR/${PREFIX}$(printf "%04d" $COUNT).$ext"
((COUNT++))
fi
done
使用建议: 1. 生产环境使用前务必在测试环境验证 2. 敏感信息(如密码)建议使用环境变量或配置文件 3. 关键操作添加日志记录(示例中已包含) 4. 长时间运行脚本建议搭配nohup或screen 5. 重要脚本添加版本控制和注释
调试技巧:
- 使用 set -x
开启调试模式
- 关键步骤添加 echo
输出状态
- 使用 trap
捕获信号进行清理操作
扩展方向: 1. 与Prometheus/Grafana集成实现可视化 2. 结合Ansible实现跨主机运维 3. 添加Telegram/钉钉报警通知 4. 使用Jenkins实现定时任务管理
这些脚本可根据实际需求组合使用,建议保存为单独文件并添加可执行权限。定期审查和更新脚本以适应环境变化。