关于 server-checkup
server-checkup 是面向 Linux 主机运维者的系统化服务器设置、审计与维护技能。它将变更前基线、风险分级检查、结果验证和维护记录纳入分阶段流程。
主要功能
- 01采集基线并比较变更结果
- 02审计 SSH 与网络安全
- 03检查维护配置和自动升级
- 04按需验证 Tailscale 状态
- 05风险评分与清理建议
- 06生成维护报告
适用场景
- 01审计 SSH 和防火墙设置
- 02设置新的 Linux 服务器或 Pi
- 03重大变更前检查服务器状态
- 04记录维护后的检查结果
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ spm1001/ trousse --skill server-checkup安装后在 Claude Code 中输入/server-checkup确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdreferences/packages-to-remove.mdssh-hardening.mdterminal-compat.mdunattended-upgrades.md详细介绍
服务器维护
通过自主执行、风险评估和文档记录,系统地管理 Linux 服务器。
适用场景
- 设置新服务器或 Pi
- 安全审计或加固
- 检查现有基础设施的运行状况
- 重大变更前后(基线 → 验证)
- 重新刷写后的配置
不适用场景
- 非 Linux 系统(macOS、Windows)
- 云托管服务(使用提供商工具)
- 快速的一次性命令(直接运行即可)
执行模式
交互模式(默认)
Claude 执行每个阶段、报告发现,并询问是否要进行修复。
自动模式(高级)
自动为每个阶段启动子 Agent。速度更快,但控制力较弱。
触发自动模式:“全面服务器审计”或“彻底审计”
部分审计
- “安全审计:” → 仅执行阶段 0、2
- “设置维护:” → 仅执行阶段 0、3
- “tailscale 检查:” → 仅执行阶段 0、4
阶段工作流
阶段 0:上下文发现(新增)
首先检查是否存在现有文档:
-
查找服务器专属文档:
ls -la | grep -iE '(server|setup|readme|hostname)\.md' ls -la .claude/CLAUDE.md 2>/dev/null -
如果找到,请阅读并提取:
- 应运行的服务
- 预期配置(端口、路径、版本)
- 已知问题/特殊情况
- 以往的维护历史
- 可揭示用途的设置步骤
-
保存上下文以供验证:
- 比较实际状态与文档记录的状态
- 将差异标记为发现
- 纳入已知的正确配置
示例: 如果文档写着“04:00 重启”,但配置显示“02:00” → 标记为待审查。
阶段 1:连接与初步检查
重要:首先记录基线(在进行任何更改之前):
echo "=== BASELINE $(date +'%Y-%m-%d %H:%M') ===" | tee /tmp/server-baseline.txt
echo "Memory:" | tee -a /tmp/server-baseline.txt
free -h | tee -a /tmp/server-baseline.txt
echo -e "\nDisk:" | tee -a /tmp/server-baseline.txt
df -h / | tee -a /tmp/server-baseline.txt
echo -e "\nPackages:" | tee -a /tmp/server-baseline.txt
dpkg -l | grep -c '^ii' | tee -a /tmp/server-baseline.txt
echo -e "\nServices:" | tee -a /tmp/server-baseline.txt
systemctl list-units --type=service --state=running --no-pager | wc -l | tee -a /tmp/server-baseline.txt
系统信息发现:
-
检查错误:
# Without sudo (may fail, that's ok) dmesg 2>/dev/null | grep -iE 'error|fail|warn' | tail -20 # With sudo if needed sudo dmesg | grep -iE 'error|fail|warn' | tail -20 -
硬件与操作系统:
uname -a && cat /etc/os-release | head -5 free -h && df -h / dpkg -l | grep -c '^ii' # package count -
初步评估:
- 记录异常错误
- 检查磁盘空间是否不足(>80%)
- 检查可用内存是否过低(<500MB)
阶段 2:安全审计
SSH 配置:
grep -E '^(Password|PermitRoot|X11)' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/* 2>/dev/null | grep -v '^#'
目标状态:
PasswordAuthentication no✅PermitRootLogin no✅X11Forwarding no✅(无头服务器)
Sudo 配置:
sudo ls -la /etc/sudoers.d/
网络暴露情况:
# Listening ports (external only)
ss -tlnp 2>/dev/null | grep -v '127.0.0' | grep -v tailscale
# Firewall status
sudo systemctl status ufw 2>&1 | head -5 || sudo iptables -L -n | head -10
安全评分(自动应用):
| 发现 | 风险等级 | 修复命令 |
|---|---|---|
| 已启用密码认证 | 严重 | echo "PasswordAuthentication no" | sudo tee -a /etc/ssh/sshd_config.d/99-hardening.conf && sudo systemctl reload sshd |
| 已启用 Root 登录 | 严重 | echo "PermitRootLogin no" | sudo tee -a /etc/ssh/sshd_config.d/99-hardening.conf && sudo systemctl reload sshd |
| 没有防火墙 + 端口转发 + 外部暴露 | 高 | 安装 ufw:sudo apt install ufw |
| 没有防火墙 + 位于 NAT 后方 + 仅使用 VPN | 低 | 路由器 + VPN 可提供保护 |
| 无头服务器上启用了 X11Forwarding | 中 | echo "X11Forwarding no" | sudo tee -a /etc/ssh/sshd_config.d/99-hardening.conf && sudo systemctl reload sshd |
阶段 3:维护设置
检查 unattended-upgrades:
dpkg -l unattended-upgrades 2>&1 | grep '^ii'
如果缺少: sudo apt install unattended-upgrades
检查配置:
sudo grep -E '^(Unattended-Upgrade::(Allowed-Origins|Remove|Automatic-Reboot))' /etc/apt/apt.conf.d/50unattended-upgrades | head -20
目标配置:
- 所有软件包(不只是安全更新)——参见 references/unattended-upgrades.md
- 启用自动重启并指定时间
- 移除未使用的软件包
- 包含自定义软件源(Tailscale、Plex 等)
验证服务:
systemctl status unattended-upgrades --no-pager | head -8
检查重启时间是否未被注释:
sudo grep "Automatic-Reboot-Time" /etc/apt/apt.conf.d/50unattended-upgrades
阶段 4:Tailscale(如适用)
检查是否已安装 Tailscale:
which tailscale && tailscale version || echo "Not installed"
如果已安装,检查状态:
tailscale status --self 2>&1 | head -3
tailscale status 2>&1 | grep -E 'exit node|subnet' | head -5
验证 IP 转发设置是否持久化:
cat /etc/sysctl.d/99-tailscale.conf 2>/dev/null
应包含:
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
设置后提醒: 对于始终在线的节点,请在管理控制台中禁用密钥过期。
阶段 5:清理
识别不必要的软件包:
dpkg -l | grep -E '^ii.*(man-db|bluetooth|bluez|avahi|pulseaudio|alsa)' | awk '{print $2}' | sort
检查不必要的服务:
systemctl list-unit-files | grep enabled | grep -E '(bluetooth|avahi|serial-getty)'
无头服务器常见的移除项:
| 软件包/服务 | 移除原因 | 风险 | 命令 |
|---|---|---|---|
| man-db | 重建 man 手册页会拖慢 apt 更新 | LOW | sudo apt remove --purge -y man-db |
| avahi-daemon | 使用 Tailscale/静态 IP 时不需要 mDNS | LOW | sudo systemctl disable --now avahi-daemon.service avahi-daemon.socket |
| bluetooth packages | 服务器上不会使用 | LOW | 保留库;如果守护进程正在运行,则移除 |
| serial-getty | 无头服务器不需要 | LOW | sudo systemctl disable serial-getty@ttyS0 |
子 Agent 决策矩阵:
| 场景 | 使用子 Agent? | 原因 |
|---|---|---|
| 移除 1-2 个软件包 | ❌ | 使用 apt remove | tail -10 |
| 移除 5 个或更多软件包 | ✅ | 冗长的输出会耗尽上下文 |
| 检查 1-2 项服务 | ❌ | 直接运行命令即可 |
| 全面审查服务 | ✅ | 需要进行大量解析 |
**规则:**如果操作会产生超过 200 行输出,请使用子 Agent。
重要:使用简洁输出,避免上下文耗尽:
# Good - terse
sudo apt remove -y pkg1 pkg2 pkg3 2>&1 | tail -10
# Bad - verbose
sudo apt remove -y pkg1 pkg2 pkg3 # Full output
阶段 6:验证
与基线进行比较:
echo -e "\n=== AFTER $(date +'%Y-%m-%d %H:%M') ===" | tee -a /tmp/server-baseline.txt
free -h | grep "Mem:" | tee -a /tmp/server-baseline.txt
df -h / | tail -1 | tee -a /tmp/server-baseline.txt
dpkg -l | grep -c '^ii' | tee -a /tmp/server-baseline.txt
systemctl list-units --type=service --state=running --no-pager | wc -l | tee -a /tmp/server-baseline.txt
关键服务检查:
systemctl list-units --type=service --state=running --no-pager | grep -E 'ssh|tailscale|docker|NetworkManager|unattended'
最终摘要:
echo "=== Memory ===" && free -h | head -2
echo "=== Disk ===" && df -h /
echo "=== Packages ===" && dpkg -l | grep -c '^ii'
展示改进:
- 释放的内存
- 节省的磁盘空间
- 移除的软件包
- 已禁用的服务
阶段 7:生成报告(新增)
创建维护记录:
选项 A:追加到现有服务器文档(如果在阶段 0 中找到)
## Maintenance History
### YYYY-MM-DD: <Brief Summary>
**Findings:**
- [Risk Level] Finding description
- Fixed: command/action taken
**Changes Applied:**
- Security: X11 disabled, SSH hardened
- Cleanup: Removed N packages, disabled M services
- Performance: Freed XGB RAM, XGB disk
**System Health:**
- Memory: X available
- Disk: X% used
- Services: N running
- Uptime: N days
选项 B:创建新的维护报告
保存为 MAINTENANCE-YYYY-MM-DD.md:
# Server Maintenance: <hostname>
Date: YYYY-MM-DD
Auditor: Claude Code
## Executive Summary
- **Overall Risk:** Low/Medium/High
- **Findings:** N total (X critical, Y high, Z medium)
- **Time to Fix:** ~N minutes
- **Changes Applied:** N fixes
## Critical Issues
[Auto-populated from Phase 2 findings with CRITICAL/HIGH risk]
## Security Audit
- SSH: ✅/⚠️
- Firewall: ✅/⚠️
- Services: ✅/⚠️
## Maintenance Setup
- Unattended-upgrades: ✅/⚠️
- Auto-reboot: ✅/⚠️
- Custom repos: ✅/⚠️
## Changes Applied
[Commands run with output summary]
## System Health
**Before:**
- Memory: X available
- Disk: X% used
- Packages: N installed
**After:**
- Memory: X available (+Y freed)
- Disk: X% used (+Y freed)
- Packages: N installed (-Y removed)
## Services Inventory
[What's running and why - from Phase 0 context + discovery]
## Recommendations
[Remaining issues sorted by risk level with fix commands]
询问用户:“应该追加到现有的 .md,还是创建新的 MAINTENANCE-.md?”
决策逻辑与风险评分
自动风险评估
系统会自动为每项发现评分:
风险维度:
- **安全影响:**这是否会暴露系统?
- **影响范围:**暴露范围是本地、网络还是互联网?
- **利用难度:**容易(远程)还是困难(仅限本地)?
风险级别:
| 级别 | 标准 | 处理时限 |
|---|---|---|
| CRITICAL | 可能遭受远程利用、拥有特权访问权限 | 立即修复 |
| HIGH | 存在暴露且缺少安全控制 | 今天修复 |
| MEDIUM | 存在不必要的攻击面,暴露范围有限 | 本周修复 |
| LOW | 优化,风险极低 | 可选清理 |
决策树示例
防火墙评估:
IF no_firewall AND (port_forwarding OR dmz_host):
IF tailscale_only_access:
RISK = MEDIUM # VPN provides some protection
ELSE:
RISK = HIGH # Direct internet exposure
ELSE IF no_firewall AND behind_nat AND no_port_forwarding:
RISK = LOW # Router provides basic protection
服务评估:
IF service_running AND service_name IN unnecessary_list:
IF service_listening_externally:
RISK = MEDIUM # Unnecessary exposure
ELSE IF service_localhost_only:
RISK = LOW # Just resource waste
上下文管理
**问题:**apt 输出、服务列表和软件包查询会在日常操作中耗尽上下文。
解决方案:
1. 简洁输出(始终使用)
# Good
apt remove pkg 2>&1 | tail -10
dpkg -l | grep -c '^ii'
# Bad
apt remove pkg # Full output
dpkg -l # List all packages
2. 子 Agent(用于冗长操作)
使用场景:
- 移除 5 个或更多软件包
- 审查所有 systemd 服务
- 扫描大型日志文件
- 全面安全扫描
示例:
Use Task tool with subagent_type=Explore for package removal when >5 packages
3. 捕获基线(变更前)
保存初始状态,并在变更后进行比较,以证明改进效果。
4. 批量执行命令
# Good - one command
sudo apt remove -y pkg1 pkg2 pkg3 pkg4 pkg5
# Bad - five commands
sudo apt remove -y pkg1
sudo apt remove -y pkg2
...
快速参考
免密码 sudo
echo "<user> ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/010_<user>-nopasswd
sudo chmod 440 /etc/sudoers.d/010_<user>-nopasswd
SSH 加固配置
cat <<'EOF' | sudo tee /etc/ssh/sshd_config.d/99-hardening.conf
PasswordAuthentication no
PermitRootLogin no
X11Forwarding no
EOF
sudo sshd -t && sudo systemctl reload sshd
查找 unattended-upgrades 仓库来源
# Check package policy
apt-cache policy <package> | grep -E 'origin|http'
# Check repo metadata
cat /var/lib/apt/lists/*_InRelease | grep -E '^Origin:|^Label:|^Codename:'
禁用不必要的服务
sudo systemctl disable --now <service-name>
参考资料
可在 references/ 目录中找到:
unattended-upgrades.md- Debian、Tailscale、Plex 等的仓库来源模式packages-to-remove.md- 无头服务器常见的不必要软件包ssh-hardening.md- SSH 配置模式和仅使用密钥进行身份验证terminal-compat.md- 用于 SSH 兼容性的 Ghostty/terminfo 修复方案
反模式
| 反模式 | 问题 | 修复方法 |
|---|---|---|
| 流式输出完整的 apt 输出 | 上下文耗尽 | | tail-10 或子 Agent |
| 逐个删除软件包 | 速度慢、输出冗长 | 使用单条命令 apt remove pkg1 pkg2 pkg3 |
| 跳过基线记录 | 无法衡量改进 | 更改前始终先记录 |
| 忘记重启时间 | 白天立即重启 | 确认时间设置未被注释,且合理 |
| 更改后才检查配置 | 无法比较 | 先记录基线,再进行更改 |
| 不记录更改 | 日后容易混淆 | 始终生成或更新维护文档 |
使用示例
check this server: kube.lan (user: admin) # Full audit
security audit: vps01 (user: root) # Security only
full server audit: production-db # Auto mode
check this server: kube.lan, skip tailscale # Skip phase