拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux命令-ssh-keyscan(从主机收集公钥)

Linux命令-ssh-keyscan从主机收集公钥 ssh-keyscan 是一个批量收集 SSH 主机公钥的工具。与交互式的 ssh 首次连接确认不同ssh-keyscan 非交互地从指定主机获取公钥非常适合自动化脚本、主机清单管理和大规模部署前的 known_hosts 预填充。快速参考基本用法选项详解常见使用场景批量操作安全管理高级用法安全注意事项ssh-keyscan是一个批量收集 SSH 主机公钥的工具。与交互式的ssh首次连接确认不同ssh-keyscan非交互地从指定主机获取公钥非常适合自动化脚本、主机清单管理和大规模部署前的known_hosts预填充。快速参考ssh-keyscan[选项][主机...]ssh-keyscan从目标的 SSH 服务端口连接并获取公钥输出可重定向到~/.ssh/known_hosts文件避免首次连接时的交互式确认提示。基本用法# 获取单台主机的公钥ssh-keyscan server.example.com# 获取并直接添加到 known_hostsssh-keyscan-Hserver.example.com~/.ssh/known_hosts# 指定非标准端口ssh-keyscan-p2222server.example.com# 获取多个主机的公钥ssh-keyscan server1 server2 server3# 从文件批量获取ssh-keyscan-fhosts.txt选项详解选项说明-H哈希主机名推荐增加安全性-p PORT指定 SSH 端口-T TIMEOUT连接超时时间秒-t TYPE指定密钥类型rsa/dsa/ecdsa/ed25519-f FILE从文件读取主机列表-4/-6强制使用 IPv4/IPv6-c请求证书而非纯密钥-v详细输出-D打印调试信息常见使用场景# 场景 1: 避免首次连接提示 # 传统方式交互式sshnew-server.example.com# The authenticity of host new-server.example.com cant be established.# Are you sure you want to continue connecting (yes/no)?# 使用 ssh-keyscan 预填充ssh-keyscan-Hnew-server.example.com~/.ssh/known_hostssshnew-server.example.com# 无提示# 场景 2: Ansible/自动化部署 # 部署前批量添加所有主机公钥ansible all --list-hosts|tail-n2|whilereadhost;dossh-keyscan-H$host~/.ssh/known_hosts2/dev/nulldone# 场景 3: 不同密钥类型收集 # 仅收集 Ed25519 密钥ssh-keyscan-ted25519 host.example.com# 收集多种类型ssh-keyscan-tecdsa,ed25519 host.example.com# 收集全部可用类型ssh-keyscan-trsa,dsa,ecdsa,ed25519 host.example.com2/dev/null批量操作# 从 IP 范围批量收集foripin192.168.1.{1..254};dossh-keyscan-T2$ip~/.ssh/known_hosts2/dev/nulldonewait# 从主机清单文件批量操作cathostlist.txtEOF 192.168.1.10 192.168.1.20 db.private.local web.prod.internal EOF# 哈希存储推荐ssh-keyscan-H-fhostlist.txt~/.ssh/known_hosts# 非哈希存储调试时使用ssh-keyscan-fhostlist.txtknown_hosts_plain.txt# 去重 known_hostssort-u~/.ssh/known_hosts-o~/.ssh/known_hosts# 并行批量收集超时 3 秒cathostlist.txt|xargs-P10-I{}ssh-keyscan-T3-H{}~/.ssh/known_hosts2keyscan_errors.log# 验证收集结果wc-l~/.ssh/known_hosts安全管理# 清除特定主机的旧记录ssh-keygen-Rcompromised-host.example.com# 清除旧记录后重新扫描ssh-keyscan-Hnew-server.example.com~/.ssh/known_hosts# 验证 known_hosts 中的记录ssh-keygen-H-Fserver.example.com# 审计 known_hosts 文件echo known_hosts 审计 echo总记录数:$(wc-l~/.ssh/known_hosts)echoMD5 哈希:$(md5sum ~/.ssh/known_hosts|cut-d -f1)# 提取所有主机名需要先取消哈希安全注意ssh-keygen-F*-f~/.ssh/known_hosts2/dev/null# 对比新旧主机密钥检测 MITM 攻击ssh-keyscan server.example.com|whilereadline;doifgrep-qF$line~/.ssh/known_hosts;thenecho✅ 密钥匹配: server.example.comelseecho❌ 密钥不匹配可能存在中间人攻击fidone高级用法# 为特定子网生成 known_hosts 文件NETWORK10.0.0mkdir-p/tmp/ssh_scanforoctetin{1..50};dossh-keyscan-T1-H${NETWORK}.${octet}/tmp/ssh_scan/network_hosts2/dev/nulldonewaitecho收集完成条目数:$(wc-l/tmp/ssh_scan/network_hosts)# 按密钥类型分类输出ssh-keyscan-trsa-Hhost.example.comrsa_keys.txt ssh-keyscan-ted25519-Hhost.example.comed25519_keys.txt# 导出为 SSHFP DNS 记录格式ssh-keyscan host.example.com|ssh-keygen-rhost.example.com# 扫描域名对应的多个 IP处理负载均衡HOSTcdn.example.comforipin$(digshort$HOST);doecho# IP:$ipssh-keyscan-T3$ip2/dev/nulldone# 脚本化检查密钥是否已存在于 known_hostscheck_known_host(){localhost$1ifssh-keygen-F$host-f~/.ssh/known_hosts/dev/null21;thenecho✅$host已存在于 known_hostsreturn0elseecho⚠️$host未在 known_hosts 中正在添加...ssh-keyscan-H$host~/.ssh/known_hosts2/dev/nullreturn$?fi}check_known_hostnew-server.local安全注意事项安全警告ssh-keyscan不验证主机身份——它只是收集公钥。收到的主机公钥在首次使用时都应通过带外方式如电话、当面确认进行验证始终使用-H选项哈希主机名防止主机名信息泄露在生产环境中应使用 SSH CA 证书签名代替手动 known_hosts 管理定期使用ssh-keygen -R清理不再需要的 known_hosts 记录# SSH CA 模式企业推荐方案避免手动管理 known_hosts# 客户端配置 ~/.ssh/configcat~/.ssh/configEOF Host *.company.com CertificateFile ~/.ssh/user_key-cert.pub EOF# 这样就不需要逐台收集主机密钥了ssh-keyscan是自动化 SSH 部署中的先遣工具。虽然它不验证主机身份但在可信任的私有网络环境中它极大地简化了首次 SSH 连接的工作流程。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门