大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
运维脚本编程基础
手动 SSH 改配置、逐台重启服务无法 scale。Bash / Python 脚本 把重复运维动作自动化:批量查端口、备份邮件队列、DNS 变更验证、健康检查。本课不要求成为开发,但需能 读、改、写 50 行以内的实用脚本。版本管理见 git-essentials,Linux 基础见 linux-essentials,网络排查见 networking-essentials,DNS 验证见 dns-essentials。
学习目标
- 编写带
set -euo pipefail的健壮 Bash 脚本 - 用 Python 调用 subprocess / socket 做端口与 SMTP 探测
- 将脚本纳入 Git 仓库并与 cron/systemd timer 集成
Bash 脚本模板
#!/bin/bash
# check-mail-ports.sh — 检查邮件相关端口是否监听
set -euo pipefail
PORTS=(25 587 993)
HOST="${1:-127.0.0.1}"
for port in "${PORTS[@]}"; do
if ss -tln | grep -q ":${port} "; then
echo "OK ${HOST}:${port} listening"
else
echo "FAIL ${HOST}:${port} not listening" >&2
exit 1
fi
done
chmod +x check-mail-ports.sh
./check-mail-ports.sh
./check-mail-ports.sh 192.168.1.10
常用运维脚本模式
备份 Postfix 队列
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/var/backups/postfix"
DATE=$(date +%Y%m%d-%H%M%S)
mkdir -p "$BACKUP_DIR"
tar czf "${BACKUP_DIR}/spool-${DATE}.tar.gz" /var/spool/postfix
find "$BACKUP_DIR" -name 'spool-*.tar.gz' -mtime +7 -delete
echo "Backup done: spool-${DATE}.tar.gz"
DNS 传播检查
#!/bin/bash
set -euo pipefail
DOMAIN="${1:?usage: $0 example.com}"
for resolver in 8.8.8.8 1.1.1.1; do
echo "=== $resolver ==="
dig TXT "$DOMAIN" @"$resolver" +short | grep -i spf || echo "(no SPF)"
done
Python:SMTP 探测
#!/usr/bin/env python3
"""smtp_probe.py — 测试 SMTP Submission 端口"""
import socket
import sys
def probe(host: str, port: int = 587, timeout: float = 5.0) -> bool:
try:
with socket.create_connection((host, port), timeout=timeout):
print(f"OK {host}:{port} reachable")
return True
except OSError as e:
print(f"FAIL {host}:{port} — {e}", file=sys.stderr)
return False
if __name__ == "__main__":
host = sys.argv[1] if len(sys.argv) > 1 else "localhost"
sys.exit(0 if probe(host) else 1)
python3 smtp_probe.py smtp.example.com
Python 适合 JSON 解析、调用云 API;Bash 适合管道组合、ssh 批量执行——先 Bash,复杂再 Python。
定时执行
# crontab -e
0 2 * * * /opt/infra/scripts/backup-mail.sh >> /var/log/backup-mail.log 2>&1
*/5 * * * * /opt/infra/scripts/check-mail-ports.sh || mail -s "ALERT: mail ports" ops@example.com
或 systemd timer(linux-systemd):
# /etc/systemd/system/check-mail-ports.timer
[Timer]
OnCalendar=*:0/5
Persistent=true
[Install]
WantedBy=timers.target
脚本质量 checklist
set -euo pipefail— 遇错即停、未定义变量报错- 用法说明 —
$0无参时打印 usage - 日志 — echo 关键步骤;错误走 stderr
- 进 Git — git-essentials 管理,PR review
- 不测生产 — 先在 staging 跑通
练习
- 写 Bash 脚本:检查 22/587/993 三端口,任一失败 exit 1
- 写 Python 脚本:对指定主机探测 587 端口 TCP 连通性
- 将脚本放入 infra 仓库,添加 cron 或 systemd timer 条目(文档即可)
小结
运维脚本 = 可重复、可版本化、可定时执行的运维动作。 Bash 上手快,Python 处理复杂逻辑。下一课综合——邮件系统搭建与日常运维。