前言
做运维的同学应该都有这种感受:每天重复操作一堆命令——检查磁盘、备份数据库、清理日志、重启服务……这些活儿人工干一遍两遍还行,天天干谁也受不了。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辅助作者原创,未经许可,转载请保留原文链接。

发表评论