ssh-keyscan
获取远程 SSH 服务器的公钥,用于管理 known_hosts 文件
语法
ssh-keyscan [options] hostname
参数
| 参数 | 说明 | 示例 | 级别 |
|---|---|---|---|
-t |
指定密钥类型 | ssh-keyscan -t ed25519 host |
常用 |
-p |
指定端口 | ssh-keyscan -p 2222 host |
常用 |
-H |
对主机名进行哈希处理 | ssh-keyscan -H host >> ~/.ssh/known_hosts |
进阶 |
-f |
从文件读取主机列表 | ssh-keyscan -f hosts.txt |
进阶 |
-T |
设置连接超时时间(秒) | ssh-keyscan -T 5 host |
进阶 |
示例
获取主机公钥并添加到 known_hosts
ssh-keyscan github.com >> ~/.ssh/known_hosts
CI/CD 中常用,避免首次连接的交互确认
获取指定类型的密钥
ssh-keyscan -t ed25519,rsa server.example.com
只获取 ed25519 和 rsa 类型的主机密钥
批量扫描多台主机
ssh-keyscan -f server_list.txt >> ~/.ssh/known_hosts
从文件读取主机列表批量获取密钥
哈希主机名增强安全性
ssh-keyscan -H 192.168.1.100 >> ~/.ssh/known_hosts
哈希后 known_hosts 中不会暴露服务器 IP
常见错误
getaddrinfo: Name or service not known
主机名无法解析,检查 DNS 或使用 IP 地址
Connection timed out
目标主机不可达或防火墙阻止,检查网络连通性
技巧
- CI/CD 流水线中用 ssh-keyscan 预填 known_hosts 避免交互式确认
- 使用 -H 哈希主机名可以防止 known_hosts 泄露你连接过哪些服务器
- 定期更新 known_hosts 中的密钥,防止中间人攻击