插件窝 干货文章 运维常用的 34 个 Linux Shell 脚本,一定能帮到你!

运维常用的 34 个 Linux Shell 脚本,一定能帮到你!

bash echo log 脚本 462    来源:    2025-04-13

作为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
  1. 内存监控脚本(带缓存计算)
#!/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
  1. 日志自动轮转脚本
#!/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 {} \;
  1. 增量文件备份(使用rsync)
#!/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
  1. 文件完整性检查
#!/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
  1. 批量DNS解析
#!/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
  1. 服务自动重启
#!/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秒进度条
  1. 文件批量重命名
#!/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实现定时任务管理

这些脚本可根据实际需求组合使用,建议保存为单独文件并添加可执行权限。定期审查和更新脚本以适应环境变化。