CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
DevOps 网络与邮件/课时/编程语言选型
RawBlame
课时目录12 节

DevOps 网络与邮件

  1. 01网络与运维基础
  2. 02OSI 与分层
  3. 03SSH 远程管理
  4. 04FTP 与 SFTP
  5. 05SMTP 发信
  6. 06IMAP 与 POP3
  7. 07邮件认证
  8. 08编辑器与文本处理
  9. 09版本控制回顾
  10. 10编程语言选型
  11. 11邮件运维排障
  12. 12综合练习

编程语言选型

learn-a-programming-language;DevOps 脚本语言。

25 分钟

运维脚本编程基础

手动 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

  1. set -euo pipefail — 遇错即停、未定义变量报错
  2. 用法说明 — $0 无参时打印 usage
  3. 日志 — echo 关键步骤;错误走 stderr
  4. 进 Git — git-essentials 管理,PR review
  5. 不测生产 — 先在 staging 跑通

练习

  • 写 Bash 脚本:检查 22/587/993 三端口,任一失败 exit 1
  • 写 Python 脚本:对指定主机探测 587 端口 TCP 连通性
  • 将脚本放入 infra 仓库,添加 cron 或 systemd timer 条目(文档即可)

小结

运维脚本 = 可重复、可版本化、可定时执行的运维动作。 Bash 上手快,Python 处理复杂逻辑。下一课综合——邮件系统搭建与日常运维。

加载本节练习…
← 上一课版本控制回顾下一课 →邮件运维排障