使用ssh-keyscan批量采集主机指纹并预置到known_hosts,可实现SSH免交互连接;需配合hosts.txt列表、指定密钥类型(如ed25519)、严格权限控制及禁用HashKnownHosts以确保匹配有效。

直接用 ssh-keyscan 批量采集并预置主机指纹,就能避免首次连接时交互式挂起。关键不是“跳过警告”,而是提前把可信的公钥指纹写入 known_hosts,让后续所有 SSH 操作(包括脚本、rsync、ansible)静默通过。
批量采集指纹并写入 known_hosts
最常用也最可靠的方式是用 ssh-keyscan 一次性获取多台主机的公钥,并追加到本地 ~/.ssh/known_hosts:
- 准备一个 IP 或主机名列表文件,比如
hosts.txt,每行一个地址(支持带端口,如192.168.1.10:2222) - 执行命令:
ssh-keyscan -f hosts.txt 2>/dev/null | sort -u >> ~/.ssh/known_hosts -
sort -u防止重复写入;2>/dev/null屏蔽连接失败的报错(如主机离线、端口不通),不影响成功条目
按密钥类型精准采集(推荐用于新环境)
默认 ssh-keyscan 会尝试多种算法(rsa、ecdsa、ed25519),但现代系统普遍优先使用 ed25519。指定类型可减少冗余、提升一致性:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 只采集 ed25519 公钥:
ssh-keyscan -t ed25519 -f hosts.txt 2>/dev/null >> ~/.ssh/known_hosts - 若需兼容老系统,可分两次采集:
ssh-keyscan -t rsa -f hosts.txt 2>/dev/null >> ~/.ssh/known_hostsssh-keyscan -t ed25519 -f hosts.txt 2>/dev/null >> ~/.ssh/known_hosts
配合脚本实现免交互全自动化
在运维脚本中嵌入指纹预置逻辑,确保每次执行前 known_hosts 已就绪:
- 先清空临时记录(可选):
rm -f ~/.ssh/known_hosts.tmp - 批量扫描并保存:
ssh-keyscan -t ed25519 -f hosts.txt 2>/dev/null > ~/.ssh/known_hosts.tmp - 验证是否至少采集到一条有效记录:
if [ $(wc -l - 安全合并(避免覆盖原有可信条目):
cat ~/.ssh/known_hosts.tmp >> ~/.ssh/known_hosts
注意事项与避坑点
几个容易导致信任失败的细节必须处理:
-
权限要严格:确保
~/.ssh目录权限为700,known_hosts文件为644或600;否则 OpenSSH 可能拒绝读取 -
避免哈希化干扰:如果本地
ssh_config启用了HashKnownHosts yes,新写入的明文主机名会被自动哈希,导致后续匹配失效;临时禁用可在扫描前加:ssh -o HashKnownHosts=no -o StrictHostKeyChecking=no example.com true - 生产环境慎用 StrictHostKeyChecking=no:它只是绕过检查,不解决根本问题;真正健壮的自动化应以预置指纹为前提,而非依赖该选项










