mcpField
S
server-checkup

server-checkup

github.com/spm1001云与 DevOps49 次安装
代码仓库

关于 server-checkup

server-checkup 是面向 Linux 主机运维者的系统化服务器设置、审计与维护技能。它将变更前基线、风险分级检查、结果验证和维护记录纳入分阶段流程。

主要功能

  1. 01采集基线并比较变更结果
  2. 02审计 SSH 与网络安全
  3. 03检查维护配置和自动升级
  4. 04按需验证 Tailscale 状态
  5. 05风险评分与清理建议
  6. 06生成维护报告

适用场景

  1. 01审计 SSH 和防火墙设置
  2. 02设置新的 Linux 服务器或 Pi
  3. 03重大变更前检查服务器状态
  4. 04记录维护后的检查结果

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/spm1001/trousse --skill server-checkup

安装后在 Claude Code 中输入/server-checkup确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
references/
packages-to-remove.md
ssh-hardening.md
terminal-compat.md
unattended-upgrades.md

详细介绍

服务器维护

通过自主执行、风险评估和文档记录,系统地管理 Linux 服务器。

适用场景

  • 设置新服务器或 Pi
  • 安全审计或加固
  • 检查现有基础设施的运行状况
  • 重大变更前后(基线 → 验证)
  • 重新刷写后的配置

不适用场景

  • 非 Linux 系统(macOS、Windows)
  • 云托管服务(使用提供商工具)
  • 快速的一次性命令(直接运行即可)

执行模式

交互模式(默认)

Claude 执行每个阶段、报告发现,并询问是否要进行修复。

自动模式(高级)

自动为每个阶段启动子 Agent。速度更快,但控制力较弱。

触发自动模式:“全面服务器审计”或“彻底审计”

部分审计
  • “安全审计:” → 仅执行阶段 0、2
  • “设置维护:” → 仅执行阶段 0、3
  • “tailscale 检查:” → 仅执行阶段 0、4

阶段工作流

阶段 0:上下文发现(新增)

首先检查是否存在现有文档:

  1. 查找服务器专属文档:

    ls -la | grep -iE '(server|setup|readme|hostname)\.md'
    ls -la .claude/CLAUDE.md 2>/dev/null
    
  2. 如果找到,请阅读并提取:

    • 应运行的服务
    • 预期配置(端口、路径、版本)
    • 已知问题/特殊情况
    • 以往的维护历史
    • 可揭示用途的设置步骤
  3. 保存上下文以供验证:

    • 比较实际状态与文档记录的状态
    • 将差异标记为发现
    • 纳入已知的正确配置

示例: 如果文档写着“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

系统信息发现:

  1. 检查错误:

    # 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
    
  2. 硬件与操作系统:

    uname -a && cat /etc/os-release | head -5
    free -h && df -h /
    dpkg -l | grep -c '^ii'  # package count
    
  3. 初步评估:

    • 记录异常错误
    • 检查磁盘空间是否不足(>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 更新LOWsudo apt remove --purge -y man-db
avahi-daemon使用 Tailscale/静态 IP 时不需要 mDNSLOWsudo systemctl disable --now avahi-daemon.service avahi-daemon.socket
bluetooth packages服务器上不会使用LOW保留库;如果守护进程正在运行,则移除
serial-getty无头服务器不需要LOWsudo 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?”

决策逻辑与风险评分

自动风险评估

系统会自动为每项发现评分:

风险维度:

  1. **安全影响:**这是否会暴露系统?
  2. **影响范围:**暴露范围是本地、网络还是互联网?
  3. **利用难度:**容易(远程)还是困难(仅限本地)?

风险级别:

级别标准处理时限
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

评论

支持 Markdown