0

自动化运维Shell脚本合集:10个拿来即用的实战脚本

2026.05.21 | youres | 13次围观

前言

做运维的同学应该都有这种感受:每天重复操作一堆命令——检查磁盘、备份数据库、清理日志、重启服务……这些活儿人工干一遍两遍还行,天天干谁也受不了。Shell脚本就是解决这个问题的利器,几行代码就能把重复劳动自动化掉。

今天整理了10个在实际运维工作中最常用的Shell脚本,都是可以直接拿去用或者稍作修改就能上手的。不搞花里胡哨的,实用第一。

一、系统信息一键查看脚本

新接手一台服务器,第一件事就是摸清家底。这个脚本帮你一秒查看CPU、内存、磁盘、系统版本等关键信息。

#!/bin/bash
echo "========== 系统信息 =========="
echo "主机名: $(hostname)"
echo "系统: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "内核: $(uname -r)"
echo "CPU: $(nproc) 核"
echo "内存: $(free -h | awk '/Mem/{print $2}')"
echo "已用内存: $(free -h | awk '/Mem/{print $3}')"
echo "磁盘使用:"
df -h | grep -E '/$|/data' | awk '{print "  "$6" -> "$5" ("$3"/"$2")"}'
echo "运行时间: $(uptime -p)"
echo "IP地址: $(hostname -I | awk '{print $1}')"

把这段保存为 sysinfo.sh,给执行权限跑一下,服务器的基本情况就一目了然了。

二、MySQL数据库自动备份脚本

数据库备份是运维的底线工作,这个脚本支持全库备份、自动压缩、保留天数控制。

#!/bin/bash
# MySQL自动备份脚本
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
KEEP_DAYS=7
MYSQL_USER="backup_user"
MYSQL_PASS="your_password"

mkdir -p $BACKUP_DIR

DATABASES=$(mysql -u$MYSQL_USER -p$MYSQL_PASS -e "SHOW DATABASES;" | grep -Ev "Database|information_schema|performance_schema")

for DB in $DATABASES; do
    mysqldump -u$MYSQL_USER -p$MYSQL_PASS --single-transaction --routines $DB | gzip > $BACKUP_DIR/${DB}_${DATE}.sql.gz
    echo "已备份: $DB"
done

# 清理过期备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$KEEP_DAYS -delete
echo "备份完成,保留最近${KEEP_DAYS}天"

建议配合cron每天凌晨3点执行,比如 0 3 * * * /opt/scripts/mysql_backup.sh

三、Nginx日志切割脚本

日志不切割,磁盘撑爆只是时间问题。这个脚本按天切割Nginx访问日志,自动压缩旧日志。

#!/bin/bash
LOG_DIR="/var/log/nginx"
DATE=$(date +%Y%m%d)
KEEP_DAYS=30

for LOG in $LOG_DIR/*.log; do
    BASE=$(basename $LOG .log)
    mv $LOG ${LOG_DIR}/${BASE}_${DATE}.log
done

nginx -s reopen

# 压缩旧日志
find $LOG_DIR -name "*_*.log" -mtime +1 -exec gzip {} \;
find $LOG_DIR -name "*.gz" -mtime +$KEEP_DAYS -delete

Nginx日志增长速度很快,建议每周检查一次日志目录的磁盘占用情况。

四、磁盘空间监控告警脚本

磁盘满了再发现就晚了。这个脚本检查磁盘使用率,超过阈值自动发告警。

#!/bin/bash
THRESHOLD=85
ALERT_EMAIL="admin@example.com"
HOSTNAME=$(hostname)

df -h | awk -v t=$THRESHOLD 'NR>1 && int($5) > t {
    print $6 " 使用率: " $5
}' | while read line; do
    echo -e "磁盘告警\n主机: $HOSTNAME\n$line" | mail -s "[$HOSTNAME] 磁盘空间告警" $ALERT_EMAIL
    echo "告警已发送: $line"
done

阈值建议设为80%-85%,给运维留出处理时间。大规模环境可以和Zabbix/Prometheus等监控工具联动。

五、服务状态检测与自动重启脚本

关键服务挂了不能干等着,这个脚本检测服务状态,挂了就自动拉起来。

#!/bin/bash
SERVICES=("nginx" "mysql" "php-fpm")
LOG_FILE="/var/log/service_monitor.log"

for SVC in "${SERVICES[@]}"; do
    if ! systemctl is-active --quiet "$SVC"; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') $SVC 已停止,正在重启..." >> $LOG_FILE
        systemctl restart "$SVC"
        sleep 5
        if systemctl is-active --quiet "$SVC"; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') $SVC 重启成功" >> $LOG_FILE
        else
            echo "$(date '+%Y-%m-%d %H:%M:%S') $SVC 重启失败,需人工介入!" >> $LOG_FILE
        fi
    fi
done

加到cron里每分钟跑一次。大规模场景建议用Supervisor或systemd的Restart配置。

六、一键部署LNMP环境脚本

新服务器初始化少不了装环境,这个脚本在CentOS和Ubuntu上都能用。

#!/bin/bash
if [ -f /etc/redhat-release ]; then
    yum install -y epel-release
    yum install -y nginx mariadb-server php php-fpm php-mysql
    systemctl enable nginx mariadb php-fpm
    systemctl start nginx mariadb php-fpm
elif [ -f /etc/lsb-release ]; then
    apt update
    apt install -y nginx mariadb-server php php-fpm php-mysql
    systemctl enable nginx mariadb php-fpm
    systemctl start nginx mariadb php-fpm
fi
echo "LNMP环境安装完成"
echo "MySQL安全配置请运行: mysql_secure_installation"

这是基础版本,生产环境建议加上版本锁定、配置优化、安全加固等步骤。

七、文件批量查找与清理脚本

服务器上大文件和临时文件积累多了会浪费空间,这个脚本帮你快速定位。

#!/bin/bash
echo "=== 磁盘占用TOP10 ==="
du -ah / 2>/dev/null | sort -rh | head -10

echo ""
echo "=== 7天未访问的大文件(>100MB) ==="
find / -type f -atime +7 -size +100M 2>/dev/null -exec ls -lh {} \;

echo ""
echo "=== /tmp目录清理(保留7天内文件) ==="
find /tmp -type f -mtime +7 -delete
echo "清理完成"

建议先用 echo 预览,确认无误后再去掉真正执行删除操作。安全第一。

八、网络连通性检测脚本

服务器网络出问题时,快速判断是本机问题还是上游问题。

#!/bin/bash
TARGETS=("8.8.8.8" "baidu.com" "taobao.com" "114.114.114.114")
COUNT=3

for target in "${TARGETS[@]}"; do
    echo -n "Ping ${target}: "
    if ping -c $COUNT -W 2 "$target" &>/dev/null; then
        loss=$(ping -c $COUNT "$target" | grep loss | awk -F',' '{print $3}' | awk '{print $1}')
        echo "OK (丢包率: ${loss})"
    else
        echo "FAIL"
    fi
done

echo ""
echo "=== DNS解析测试 ==="
for domain in "baidu.com" "qq.com"; do
    echo -n "${domain} -> "
    dig +short "$domain" A | head -1
done

排查网络问题的标准流程:先ping外网IP看通不通,再ping域名看DNS正不正常,最后curl具体服务看端口通不通。

九、SSL证书到期检测脚本

证书过期导致网站挂掉的事故太常见了,这个脚本提前30天预警。

#!/bin/bash
DOMAINS=("example.com" "api.example.com" "cdn.example.com")
DAYS_WARN=30

for domain in "${DOMAINS[@]}"; do
    expiry=$(echo | openssl s_client -servername "$domain" -connect "${domain}:443" 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null)
    if [ -n "$expiry" ]; then
        expiry_date=$(echo "$expiry" | cut -d= -f2)
        expiry_epoch=$(date -d "$expiry_date" +%s)
        now_epoch=$(date +%s)
        days_left=$(( (expiry_epoch - now_epoch) / 86400 ))
        if [ $days_left -le $DAYS_WARN ]; then
            echo "告警: ${domain} 证书将在${days_left}天后过期 (${expiry_date})"
        else
            echo "${domain} 证书正常,剩余${days_left}天"
        fi
    else
        echo "错误: 无法获取 ${domain} 证书信息"
    fi
done

建议每天跑一次,配合邮件或钉钉告警。Let's Encrypt证书90天有效期,提前30天提醒刚好够续期。

十、服务器安全巡检脚本

定期安全巡检能提前发现很多隐患。这个脚本检查常见的安全配置项。

#!/bin/bash
echo "========== 安全巡检报告 =========="

echo "[1] SSH root远程登录"
if grep -q "^PermitRootLogin no" /etc/ssh/sshd_config 2>/dev/null; then
    echo "  OK - 已禁止root远程登录"
else
    echo "  警告 - root远程登录未禁止"
fi

echo "[2] 密码登录"
if grep -q "^PasswordAuthentication no" /etc/ssh/sshd_config 2>/dev/null; then
    echo "  OK - 已禁用密码登录"
else
    echo "  警告 - 仍允许密码登录,建议改用密钥认证"
fi

echo "[3] 防火墙状态"
if systemctl is-active --quiet firewalld 2>/dev/null || systemctl is-active --quiet ufw 2>/dev/null; then
    echo "  OK - 防火墙已启用"
else
    echo "  警告 - 防火墙未启用"
fi

echo "[4] 可疑进程"
ps aux | awk '$11 ~ /^\// && $11 !~ /^(\/usr\/|\/bin\/|\/sbin\/)/ {print "  可疑: "$11}'

echo "[5] SSH授权密钥"
for user_home in /root /home/*; do
    auth_keys="${user_home}/.ssh/authorized_keys"
    if [ -f "$auth_keys" ]; then
        key_count=$(wc -l < "$auth_keys")
        echo "  ${user_home}: ${key_count} 个密钥"
    fi
done

echo "[6] 最近登录失败"
lastb -n 5 2>/dev/null | head -5

echo "巡检完成"

安全巡检建议每周执行一次,把结果存档。发现的问题要及时处理,不能拖。

脚本使用建议

  • 测试先行:所有脚本先在测试环境跑通再上生产,别直接在生产服务器上试
  • 加日志:关键操作写日志,方便事后排查问题
  • 版本管理:脚本放Git仓库管理,修改有记录可追溯
  • 权限控制:脚本文件权限设为700,避免被其他用户篡改
  • 定时执行:配合cron实现自动化,解放双手
  • 告警联动:关键脚本加上告警通知,异常情况第一时间知道

总结

这10个脚本覆盖了运维日常工作中最常见的需求:系统巡检、数据备份、日志管理、磁盘监控、服务守护、环境部署、文件清理、网络诊断、证书管理和安全检查。每个脚本都不长,但确实能解决实际问题。

运维自动化的核心不是写多复杂的脚本,而是把重复的、有规律的工作交给程序去做,把精力留给更有价值的事情。希望这些脚本能帮到你,有什么问题欢迎交流讨论。

相关推荐

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
883文章数 0评论数
作者其它文章