ssh-copy-id 与 ssh-keyscan 全面介绍:免密登录与主机密钥

配免密 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_keys600

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_hostsssh-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 → 远端信任你。两边都就位,免密和自动化部署才稳。