定期清空 known_hosts 中废弃条目需精准识别、按需清理,避免误删可信主机并阻断信任链污染;废弃条目包括下线超30天的测试主机、闲置超14天的临时云服务器、域名已变更主机及Apifox等高风险工具缓存中的记录。

定期清空 known_hosts 中废弃条目,关键不是“全删”,而是精准识别、按需清理,避免误伤可信主机,同时阻断因旧记录残留引发的信任链污染(比如被恶意软件读取后用于横向扫描或伪造跳板)。
一、明确哪些条目属于“废弃信息”
废弃 ≠ 过期,而是指已失去业务关联或安全可控性的记录:
- 测试环境主机(如
test-db2、staging-api-01)已下线超过30天 - 临时云服务器(IP含
10.0.x.x、172.16.x.x或短期ECS公网IP)未再连接超14天 - 域名指向已变更的主机(例如原
old-jenkins.example.com已停用,新CI平台用不同域名) - 出现在 Apifox 等高风险工具历史缓存中的条目(2026年3月4–22日使用过该客户端的用户,
known_hosts应视为潜在泄露面)
二、建立可维护的废弃主机清单
不依赖记忆,用轻量文本管理待清理目标:
GitHub Hosts 更新工具(仅限中国用户),安全更新系统hosts文件,保留原有非GitHub条目,仅替换GitHub相关地址。支持备份恢复和风险提示。用于解决GitHub访问问题。
- 在
~/.ssh/下新建obsolete_hosts.txt,每行一个主机名或IP - 内容示例:
dev-vm-2025<br>192.168.50.12<br>legacy-git.internal
- 每次下线服务或更换测试机时,顺手追加一行,避免事后追溯遗漏
三、自动化清理脚本(推荐每周执行)
将清理动作固化为可审计、可复现的操作:
- 创建脚本
~/bin/clean-known-hosts.sh:
# 只清理明确标记为废弃的条目
if [ -f ~/.ssh/obsolete_hosts.txt ]; then
while IFS= read -r host; do
[ -n "$host" ] && ssh-keygen -R "$host" >/dev/null 2>&1
done fi
# 可选:对半年未访问的IP段做辅助扫描(仅限内网)
# grep -E '^(10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|192\.168\.)' ~/.ssh/known_hosts | cut -d' ' -f1 | while read ip; do
# if ! ping -c1 -W1 "$ip" &>/dev/null; then ssh-keygen -R "$ip"; fi
# done
- 赋予执行权限:
chmod +x ~/bin/clean-known-hosts.sh - 加入 weekly cron:
0 2 * * 0 ~/bin/clean-known-hosts.sh(每周日凌晨2点运行)
四、配合 SSH 配置增强可信边界
光清不够,要让新增记录更可控:
- 在
~/.ssh/config中为生产主机显式启用严格校验:Host prod-*<br> StrictHostKeyChecking yes<br> UserKnownHostsFile ~/.ssh/known_hosts_prod
- 把生产主机密钥单独存到
known_hosts_prod,与日常开发记录物理隔离 - 禁用通配符主机自动写入:
UpdateHostKeys no(防止未知主机悄悄混入)










