name: linux-patcher
description: 自动化 Linux 服务器补丁与 Docker 容器更新。当用户要求更新、打补丁或升级 Linux 服务器,应用安全更新,更新 Docker 容器,检查系统更新,或跨多台主机管理服务器维护时使用。支持 Ubuntu、Debian、RHEL、AlmaLinux、Rocky Linux、CentOS、Amazon Linux 和 SUSE。包含 PatchMon 集成,用于自动主机检测和智能 Docker 处理。
通过 SSH 自动化跨多台主机的 Linux 服务器补丁和 Docker 容器更新。
已全面测试:
- ✅ Ubuntu - 已在真实基础设施中进行端到端测试
支持但未测试:
- ⚠️ Debian GNU/Linux - 命令基于官方文档
- ⚠️ Amazon Linux - 支持 AL2 (yum) 和 AL2023 (dnf)
- ⚠️ RHEL (Red Hat Enterprise Linux) - 支持 RHEL 7 (yum) 和 8+ (dnf)
- ⚠️ AlmaLinux - 与 RHEL 兼容,使用 dnf
- ⚠️ Rocky Linux - 与 RHEL 兼容,使用 dnf
- ⚠️ CentOS - 支持 CentOS 7 (yum) 和 8+ (dnf)
- ⚠️ SUSE/OpenSUSE - 使用 zypper 包管理器
测试建议:
始终先在非生产环境中测试未经测试的发行版。脚本在未经测试的发行版上运行时将发出警告。
此技能要求:
- 免密码 sudo 访问权限 - 配置为受限权限
- SSH 密钥认证 - 不存储或传输密码
- PatchMon 凭据 - 安全存储在用户主目录中
请阅读 SETUP.md 获取完整的安全配置指南。
从 PatchMon 更新所有主机(自动检测):
scripts/patch-auto.sh
跳过 Docker 更新(仅更新系统包):
scripts/patch-auto.sh --skip-docker
预览更改(试运行):
scripts/patch-auto.sh --dry-run
单台主机 - 仅系统包:
scripts/patch-host-only.sh user@hostname
单台主机 - 完整更新:
scripts/patch-host-full.sh user@hostname /path/to/docker/compose
从配置文件更新多台主机:
scripts/patch-multiple.sh config-file.conf
--skip-docker 标志跳过 Docker 更新visudo 或 /etc/sudoers.d/ 文件配置配置 PatchMon 凭据以实现自动主机检测:
cp scripts/patchmon-credentials.example.conf ~/.patchmon-credentials.conf
nano ~/.patchmon-credentials.conf
设置您的凭据:
PATCHMON_URL=https://patchmon.example.com
PATCHMON_USERNAME=your-username
PATCHMON_PASSWORD=your-password
然后只需运行:
scripts/patch-auto.sh
脚本将:
1. 查询 PatchMon 以获取需要更新的主机
2. 自动检测每台主机上的 Docker
3. 应用适当的更新(仅主机或完整更新)
直接使用命令行参数运行脚本(无需配置文件)。
基于 scripts/patch-hosts-config.example.sh 创建配置文件:
cp scripts/patch-hosts-config.example.sh my-servers.conf
nano my-servers.conf
配置示例:
# 主机定义:主机名,SSH用户,Docker路径
HOSTS=(
"webserver.example.com,ubuntu,/opt/docker"
"database.example.com,root,/home/admin/compose"
"monitor.example.com,docker,/srv/monitoring"
)
# 更新模式:"host-only" 或 "full"
UPDATE_MODE="full"
# 试运行模式(设置为 "false" 以应用更改)
DRY_RUN="true"
然后运行:
scripts/patch-multiple.sh my-servers.conf
ssh 命令可用)安装缺失的工具:
# Ubuntu/Debian
sudo apt install curl jq
# RHEL/CentOS/Rocky/Alma
sudo dnf install curl jq
# macOS
brew install curl jq
需要 PatchMon 来自动检测哪些主机需要打补丁。
重要提示: PatchMon 不需要与 OpenClaw 安装在同一台服务器上。将 PatchMon 安装在单独的服务器上(可以是您网络上的任何服务器),OpenClaw 将通过 API 查询它。
下载 PatchMon:
- GitHub: https://github.com/PatchMon/PatchMon
- 文档: https://docs.patchmon.net
您需要:
- [ ] PatchMon 服务器安装在任意可访问的服务器上(不一定是 OpenClaw 主机)
- [ ] PatchMon 代理安装在所有要打补丁的目标主机上
- [ ] PatchMon API 凭据(用户名/密码)
- [ ] 从 OpenClaw 主机到 PatchMon 服务器的网络连接(HTTPS)
架构:
┌─────────────────┐ HTTPS API ┌─────────────────┐
│ OpenClaw 主机 │ ──────────────────> │ PatchMon 服务器 │
│ (本机) │ 查询更新 │ (独立主机) │
└─────────────────┘ └─────────────────┘
│
│ 报告
▼
┌─────────────────┐
│ 目标主机 │
│ (带代理) │
└─────────────────┘
快速开始:
1. 在单独的服务器上安装 PatchMon 服务器(参见 GitHub 仓库)
2. 在所有要打补丁的主机上安装 PatchMon 代理
3. 配置 OpenClaw 以访问 PatchMon API:
cp scripts/patchmon-credentials.example.conf ~/.patchmon-credentials.conf
nano ~/.patchmon-credentials.conf # 设置 PatchMon 服务器 URL
chmod 600 ~/.patchmon-credentials.conf
详细设置:
参见 references/patchmon-setup.md 获取完整的安装指南。
我可以在没有 PatchMon 的情况下使用此技能吗?
可以!您可以使用手动模式来针对特定主机,无需 PatchMon。但是,自动检测需要更新的主机需要 PatchMon。
必需:
- SSH 服务器正在运行
- SSH 用户的免密码 sudo(用于 apt 和 docker 命令)
- PatchMon 代理已安装并正在报告(用于自动模式)
对于完整更新:
- Docker 和 Docker Compose 已安装
- Docker Compose 文件存在于指定路径
在每个目标主机上,创建 /etc/sudoers.d/patches:
# 对于 Ubuntu/Debian 系统
username ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/docker
# 对于 RHEL/CentOS 系统
username ALL=(ALL) NOPASSWD: /usr/bin/yum, /usr/bin/docker, /usr/bin/dnf
将 username 替换为您的 SSH 用户。使用 sudo -l 测试以验证。
仅更新系统包:
- 运行 apt update && apt upgrade(或在 RHEL 上运行 yum update)
- 移除未使用的包(apt autoremove)
- 不 触及 Docker 容器
何时使用:
- 没有 Docker 的主机
- 仅安全补丁
- 需要最小化停机时间
完整的更新周期:
- 更新系统包
- 清理 Docker 缓存(docker system prune)
- 拉取最新的 Docker 镜像
- 使用新镜像重新创建容器
- 会导致短暂的服务中断
何时使用:
- 基于 Docker 的基础设施
- 定期维护窗口
- 有可用的应用程序更新
sudo apt updatesudo apt -y upgradesudo apt -y autoremovesudo apt update && upgrade && autoremovesudo docker system prune -af(清理)sudo docker compose pullsudo docker compose up -d(重新创建容器)使用自动模式时:
- Docker 已安装 + 找到 compose 文件 → 完整更新
- Docker 已安装 + 未找到 compose 文件 → 仅主机更新
- Docker 未安装 → 仅主机更新
- 设置了 --skip-docker 标志 → 仅主机更新(忽略 Docker)
当未指定 Docker 路径时,脚本检查以下位置:
/home/$USER/Docker/docker-compose.yml/opt/docker/docker-compose.yml/srv/docker/docker-compose.yml$HOME/Docker/docker-compose.yml覆盖自动检测:
scripts/patch-host-full.sh user@host /custom/path
# 首次使用:配置凭据
cp scripts/patchmon-credentials.example.conf ~/.patchmon-credentials.conf
nano ~/.patchmon-credentials.conf
# 运行自动更新
scripts/patch-auto.sh
# 预览将要更新的内容
scripts/patch-auto.sh --dry-run
# 查看输出,然后应用
scripts/patch-auto.sh
# 即使检测到 Docker,也仅更新系统包
scripts/patch-auto.sh --skip-docker
scripts/patch-host-only.sh admin@webserver.example.com
scripts/patch-host-full.sh docker@app.example.com /home/docker/production
scripts/patch-multiple.sh production-servers.conf
只需询问 OpenClaw:
- "更新我的服务器"
- "为所有需要更新的主机打补丁"
- "仅更新系统包,跳过 Docker"
OpenClaw 将使用自动模式并报告结果。
cp scripts/patchmon-credentials.example.conf ~/.patchmon-credentials.confPATCHMON_CONFIG 环境变量设置为自定义位置curl -k https://patchmon.example.com/api/healthsystemctl status patchmon-agent/etc/patchmon/config.ymlpatchmon-agent reportssh user@host sudo apt updatessh user@host echo OKscripts/patch-host-full.sh user@host /full/path/home/user/Docker、/opt/docker、/srv/dockerssh user@host "docker logs container-name"ssh user@host "cd /docker/path && docker compose logs"ssh user@host "cd /docker/path && docker compose down && docker compose up -d"有关仪表板监控和计划补丁,请参见 references/patchmon-setup.md。
PatchMon 提供:
- 更新状态的 Web 仪表板
- 每台主机的包跟踪
- 安全更新高亮显示
- 更新历史记录
apt、docker)/etc/sudoers.d/ 文件(更易于管理)chmod 600 ~/.ssh/id_rsa脚本不会自动重启主机。更新后:
ssh user@host "[ -f /var/run/reboot-required ] && echo YES || echo NO"为自动夜间补丁创建 cron 作业:
cron add --name "夜间服务器补丁" \
--schedule "0 2 * * *" \
--task "cd ~/.openclaw/workspace/skills/linux-patcher && scripts/patch-auto.sh"
或仅系统包模式:
cron add --name "夜间系统包更新" \
--schedule "0 2 * * *" \
--task "cd ~/.openclaw/workspace/skills/linux-patcher && scripts/patch-auto.sh --skip-docker"
只需询问 OpenClaw