
配免密 SSH 时,两个命令最容易混:ssh-copy-id 管「你能不能登上去」,ssh-keyscan 管「对面是不是那台机」。一个写远端 authorized_keys,一个写本机 known_hosts。
记法:copy-id = 拷贝登录公钥到远端;keyscan = 扫描主机密钥到本机。
相关文件一览
| 文件 | 位置 | 作用 |
|---|---|---|
id_ed25519 / .pub |
本机 ~/.ssh/ |
登录用私钥 / 公钥 |
authorized_keys |
远端 ~/.ssh/ |
允许哪些公钥登录(copy-id 写入) |
known_hosts |
本机 ~/.ssh/ |
信任哪些主机密钥(keyscan 写入) |
没有密钥时:ssh-keygen -t ed25519。目录 700,私钥与 authorized_keys 用 600。
ssh-copy-id:装登录公钥
用密码等方式登录一次,把本机公钥追加到远端 authorized_keys,之后即可免密登录。
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.10
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 user@example.com
ssh user@192.168.1.10 # 验证
常用参数:-i 指定公钥,-p 端口,-o 透传 ssh 选项(如跳板),-n 干跑。
没有该命令时,手动等价:
cat ~/.ssh/id_ed25519.pub | ssh user@host \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
仍要密码:确认写进了登录用户的家目录,且 PubkeyAuthentication yes。找不到公钥:用 -i 显式指定。
ssh-keyscan:采主机密钥
第一次 SSH 会问是否信任主机指纹;选 yes 即写入 known_hosts。ssh-keyscan 用非交互方式做同样的事——只采集主机密钥,不安装你的登录公钥,也不证明主机一定合法。
ssh-keyscan -H -t ed25519 192.168.1.10 >> ~/.ssh/known_hosts
ssh-keyscan -H -p 2222 -t ed25519 "[example.com]:2222" >> ~/.ssh/known_hosts
ssh-keyscan -H -f hosts.txt >> ~/.ssh/known_hosts # 批量
-H 哈希主机名,-t 指定算法,-f 读主机列表。CI 里先 keyscan 再 ssh,可避免卡在 yes/no:
ssh-keyscan -H -t ed25519 deploy.example.com >> ~/.ssh/known_hosts
ssh deploy@deploy.example.com "systemctl restart my-go-app"
推荐顺序
ssh-keygen → ssh-keyscan(信任主机)→ ssh-copy-id(装公钥)→ ssh 验证
ssh-keyscan -H -t ed25519 192.168.1.10 >> ~/.ssh/known_hosts
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.10
ssh user@192.168.1.10 "echo ok"
本机首次也可在 ssh/ssh-copy-id 时交互确认指纹;keyscan 更适合批量与 CI。
安全与排错
- keyscan 信任的是「扫描瞬间」的网络路径;关键主机应核对指纹,勿默认
StrictHostKeyChecking=no。 - 主机密钥变更报错时:
ssh-keygen -R host,查清原因后再重新采集。 ssh -v user@host区分卡在主机校验还是公钥认证。- copy-id 需要已有入口(密码、另一把密钥或控制台);没有则用云厂商注入公钥。
总结
ssh-keyscan → 本机信任主机;ssh-copy-id → 远端信任你。两边都就位,免密和自动化部署才稳。