You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何安全地将批量主机列表添加/更新至known_hosts文件?

批量管理SSH known_hosts条目的安全性分析与优化方案

你的这个批量处理known_hosts的思路方向没问题,但当前的循环脚本并不安全,主要有这些隐患:

现有方法的安全问题

  • 中间人攻击漏洞:ssh-keyscan直接从网络拉取目标主机的公钥并写入文件,如果在传输过程中被中间人劫持,你会把恶意服务器的公钥当成合法的存入known_hosts,后续连接这台主机时会被悄无声息地引导到恶意节点,完全没有告警。
  • 误删合法条目:ssh-keygen -R $LINE会删除所有匹配该主机名/IP的条目,如果某台主机有多个IP或者别名(比如同一个主机同时有内网和外网地址),你会误删其他合法的关联条目;要是主机名里包含空格、通配符这类特殊字符,还可能导致命令执行异常,甚至误删无关的known_hosts条目。
  • 冗余条目堆积:如果重复执行脚本,会不断往known_hosts里追加相同的哈希条目,导致文件越来越大,SSH连接时的查找效率会下降,也不利于后续维护。

更安全的优化方案

要实现安全的批量更新,核心是先验证公钥合法性,再进行添加/更新操作,同时避免误操作。这里给你几个可行的方案:

方案1:基于可信公钥库批量写入(最安全)

如果你能从可信渠道(比如运维管理平台、主机厂商提供的公钥清单)获取所有主机的可信公钥,可以直接将这些公钥哈希后写入known_hosts,完全规避网络传输带来的风险。
操作步骤:

  1. 把所有可信公钥整理到一个文件,每行一个公钥(可以先用ssh-keygen -H处理成哈希格式)
  2. 直接追加到known_hosts:cat trusted_keys_hashed >> ~/.ssh/known_hosts

方案2:安全的动态验证脚本

如果必须从网络获取公钥,可以用下面的优化脚本,它会先验证公钥获取的有效性,再安全地更新条目:

# 定义文件路径,请替换成你的实际路径
HOST_FILE="/path/to/your/host_list.txt"
KNOWN_HOSTS="$HOME/.ssh/known_hosts"

# 先备份known_hosts,避免操作失误
cp "$KNOWN_HOSTS" "${KNOWN_HOSTS}.bak"

while IFS= read -r host; do
    # 跳过空行
    [[ -z "$host" ]] && continue
    
    # 获取目标主机的哈希公钥,忽略错误输出
    new_hashed_key=$(ssh-keyscan -H "$host" 2>/dev/null)
    if [[ -z "$new_hashed_key" ]]; then
        echo "⚠️  警告:无法获取主机 $host 的公钥,跳过"
        continue
    fi

    # 检查known_hosts中是否已有该主机的条目
    if ssh-keygen -F "$host" -f "$KNOWN_HOSTS" >/dev/null 2>&1; then
        # 删除旧条目并添加新条目
        ssh-keygen -R "$host" -f "$KNOWN_HOSTS" >/dev/null 2>&1
        echo "$new_hashed_key" >> "$KNOWN_HOSTS"
        echo "✅  更新主机 $host 的known_hosts条目"
    else
        # 直接添加新条目
        echo "$new_hashed_key" >> "$KNOWN_HOSTS"
        echo "✅  添加主机 $host 的known_hosts条目"
    fi
done < "$HOST_FILE"

这个脚本的优化点:

  • 用IFS= read -r host处理带特殊字符的主机名,避免命令执行异常
  • 捕获ssh-keyscan的错误输出,跳过无法连接的主机
  • 用ssh-keygen -F先检查是否已有条目,避免盲目删除
  • 操作前自动备份known_hosts,降低失误风险

方案3:SSH配置自动处理(适合可信环境)

如果你不想写脚本,也可以修改~/.ssh/config实现自动添加新主机的公钥(注意:仅适合内网这类可信环境,仍存在中间人风险):

Host *
    StrictHostKeyChecking accept-new

这个配置会让SSH自动将新主机的公钥添加到known_hosts,不需要手动输入"yes";但如果主机公钥发生变化,SSH仍会报错,这时候你需要手动删除旧条目再重新连接。

额外安全提醒

  • 批量操作前一定要备份known_hosts,避免操作失误导致无法连接主机
  • 尽量在可信的内网环境下运行脚本,减少中间人攻击的概率
  • 对于关键业务主机,批量处理后建议手动验证公钥指纹:用ssh-keygen -l -F <主机名>查看哈希后的指纹,和主机提供的可信指纹对比确认

内容的提问来源于stack exchange,提问作者mwalto7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:33:56