哪些实用脚本适合Linux系统管理员?

wen 实用脚本 2

哪些实用脚本适合Linux系统管理员?10个必备自动化工具详解

📖 目录导读

  1. 为什么系统管理员需要脚本自动化?
  2. 10个实用脚本类型及示例
  3. 脚本编写最佳实践
  4. 常见问题问答(FAQ)

为什么系统管理员需要脚本自动化?

在Linux运维中,重复性任务(如检查磁盘使用率、批量添加用户、清理过期日志)会消耗大量时间,据统计,一位熟练的系统管理员每天可能花费30%的时间在手动操作上,而通过脚本自动化,可以将时间缩短到几分钟,同时降低人为错误风险。

哪些实用脚本适合Linux系统管理员?

典型场景:一个拥有200台服务器的集群,如果每天手动执行df -h检查磁盘,至少需要2小时;而运行一个监控脚本,只需5分钟生成报告并发送告警。


10个实用脚本类型及示例

1 系统健康监控脚本

功能:CPU、内存、负载、进程数、连接数综合监控,异常时发送邮件/Slack通知。

#!/bin/bash
# system_health.sh - 检查系统关键指标
CPU_THRESHOLD=80
MEM_THRESHOLD=80
DISK_THRESHOLD=90
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d% -f1)
mem_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
disk_usage=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
if (( $(echo "$cpu_usage > $CPU_THRESHOLD" | bc) )); then
  echo "CPU警告: ${cpu_usage}%"
  # 发送告警...
fi

2 日志轮转与清理脚本

问题:系统日志(如/var/log/syslog)可能迅速膨胀至GB级别,导致磁盘写满。

#!/bin/bash
# log_cleaner.sh - 保留最近7天日志,压缩旧日志
LOG_DIR="/var/log"
RETENTION_DAYS=7
find $LOG_DIR -name "*.log" -type f -mtime +$RETENTION_DAYS -exec gzip {} \;
find $LOG_DIR -name "*.gz" -type f -mtime +30 -delete

3 批量用户管理脚本

场景:为新员工入职创建100个账号,包含主目录、SSH密钥、组权限。

#!/bin/bash
# batch_users.sh - 从CSV文件批量创建用户
INPUT_FILE="users.csv"
while IFS=',' read -r username group shell
do
  useradd -m -s "$shell" -g "$group" "$username"
  mkdir -p /home/$username/.ssh
  echo "密钥内容" > /home/$username/.ssh/authorized_keys
  chown -R $username:$group /home/$username
done < "$INPUT_FILE"

4 备份与恢复脚本

核心逻辑:使用rsync增量备份到远程主机,保留最近30天版本。

#!/bin/bash
# backup.sh - 增量备份至远程服务器
SOURCE_DIR="/data"
REMOTE_USER="backupuser"
REMOTE_HOST="192.168.1.100"
REMOTE_DIR="/backup/$(hostname)"
rsync -avz --delete --link-dest=$REMOTE_DIR/latest "$SOURCE_DIR" $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$(date +%Y%m%d)
ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_DIR && ln -snf $(date +%Y%m%d) latest"

5 磁盘空间告警脚本

实现:遍历所有挂载点,当使用率超过阈值时发送邮件。

#!/bin/bash
# disk_alert.sh
THRESHOLD=85
df -h | grep -vE 'tmpfs|cdrom' | while read line
do
  usage=$(echo $line | awk '{print $5}' | sed 's/%//')
  mount_point=$(echo $line | awk '{print $6}')
  if [ $usage -ge $THRESHOLD ]; then
    echo "磁盘 $mount_point 使用率: ${usage}% - 超过阈值${THRESHOLD}%" | mail -s "磁盘告警" admin@example.com
  fi
done

6 网络连通性检测脚本

功能:定期Ping核心服务(数据库、Web服务器),失败时自动重启服务或切换至备用IP。

#!/bin/bash
# network_check.sh
WEB_SERVER="10.0.0.2"
DB_SERVER="10.0.0.3"
for server in $WEB_SERVER $DB_SERVER; do
  if ! ping -c2 $server &>/dev/null; then
    echo "$server 不可达,尝试重启网络服务..."
    systemctl restart networking
  fi
done

7 自动更新与补丁管理脚本

注意:生产环境建议分批次进行,并回滚机制。

#!/bin/bash
# security_update.sh - 安全补丁自动安装
yum update --security -y || apt update && apt upgrade -y 2>/dev/null
# 记录变更日志
echo "$(date) - 安全更新完成" >> /var/log/auto_patch.log
# 如果是内核更新,安排重启
if needs-restarting -r; then
  shutdown -r +5 "内核已更新,5分钟后重启"
fi

8 服务状态监控与重启脚本

场景:防止Nginx或MySQL挂掉影响业务。

#!/bin/bash
# service_watchdog.sh
SERVICES=("nginx" "mysql" "redis")
for svc in "${SERVICES[@]}"; do
  if ! systemctl is-active --quiet $svc; then
    echo "$svc 挂了,尝试重启..." | systemd-cat -t watchdog
    systemctl restart $svc
    # 如果重启失败,发送严重告警
    sleep 5
    if ! systemctl is-active --quiet $svc; then
      echo "严重: $svc 重启失败" | mail -s "服务故障" ops@company.com
    fi
  fi
done

9 文件一致性校验脚本

用途:监控关键配置文件/二进制是否被篡改(合规审计必备)。

#!/bin/bash
# integrity_check.sh
MANIFEST_FILE="/etc/security/manifest.txt"
# 生成当前文件哈希
find /etc /bin /sbin -type f | xargs md5sum > /tmp/current_manifest.txt
# 对比基线
diff $MANIFEST_FILE /tmp/current_manifest.txt | grep "^<" | while read line; do
  echo "文件被修改: $line"
done

10 容器与Docker管理脚本

功能:批量更新镜像、清理无用容器和镜像、导出日志。

#!/bin/bash
# docker_housekeeping.sh
# 删除已停止的容器
docker container prune -f
# 删除悬空镜像
docker image prune -f
# 清理超过7天的容器日志
docker logs --tail 1000 container_name > /var/log/docker/container_$(date +%Y%m%d).log

脚本编写最佳实践

错误处理:使用set -e在遇到错误时立即退出,或使用trap捕获退出信号。
日志记录:所有脚本操作应记录时间、执行结果到/var/log/
幂等性:确保脚本多次运行不会引发副作用(如重复创建用户)。
参数化:通过命令行参数(如--dry-run)控制执行模式。
定时调度:使用crontabsystemd timer,例如每天凌晨3点执行磁盘检查:
0 3 * * * /usr/local/bin/disk_alert.sh


常见问题问答(FAQ)

Q1:脚本中如何安全地存储密码或密钥?
A:避免硬编码!使用环境变量(如export DB_PASS=xxx)或从Vault(如HashiCorp Vault)获取,或在脚本中使用read -s交互式输入。

Q2:如何防止脚本在生产环境中误操作?
A:在脚本开头添加set -u(检测未定义变量)和set -o pipefail,同时实现--dry-run模式,只输出将要执行的内容。

Q3:脚本执行超时怎么办?
A:使用timeout命令包裹关键操作,timeout 30 rsync ...,若30秒未完成则结束进程。

Q4:如何让脚本支持多机批量执行?
A:结合pdshansibleparallel-sshpdsh -w server[01-50] /opt/scripts/disk_check.sh

Q5:监控脚本产生的告警如何避免重复通知?
A:实现“去抖”逻辑:记录上次告警时间,仅在间隔超过30分钟时再次发送;或使用状态文件记录当前问题是否未解决。

抱歉,评论功能暂时关闭!