ssh-copy-id仅自动推送公钥至authorized_keys,不生成密钥、不校验服务端配置与权限;需提前生成密钥(如ssh-keygen -t ed25519),确保sshd启用pubkeyauthentication、权限严格设为700/600,并用正确用户名+端口格式调用。

能用,但别指望它自动搞定一切——ssh-copy-id 只负责把公钥塞进 ~/.ssh/authorized_keys,其余全靠你提前配好、权限设对、服务跑稳。
本地没密钥就别硬试 ssh-copy-id
它不会帮你生成密钥,只找默认路径的公钥文件。运行前先确认:
-
ls -l ~/.ssh/id_*.pub—— 至少得有一个输出,比如id_rsa.pub或id_ed25519.pub - 如果啥都没,先执行
ssh-keygen -t ed25519(推荐)或ssh-keygen -t rsa -b 4096 - 用了非默认名(比如
~/.ssh/mykey.pub),必须显式指定:ssh-copy-id -i ~/.ssh/mykey.pub user@host
目标端 sshd 配置必须生效
ssh-copy-id 推完公钥,不代表就能免密登录。关键看服务端是否真认这个机制:
- 检查
/etc/ssh/sshd_config是否含这两行且未被注释:PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys - 改完配置必须重启服务:
sudo systemctl restart sshd(Ubuntu/Debian/CentOS 均适用) - 别漏掉 SELinux:若启用了,
restorecon -Rv ~/.ssh能重置上下文,否则可能静默拒绝读取
权限不对,sshd 直接无视公钥
OpenSSH 对权限极其敏感,三处必须收紧:
- 目标用户家目录:
chmod 755 ~(不能是 777 或 775) -
~/.ssh目录:chmod 700 ~/.ssh -
~/.ssh/authorized_keys文件:chmod 600 ~/.ssh/authorized_keys
ssh-copy-id 会尝试设权限,但失败时不报错,只默默跳过——所以推送后务必手动验证权限。
非标准端口或用户名怎么写命令
语法和 ssh 完全一致,但格式容易出错:
- 端口非 22:写成
ssh-copy-id -p 2222 user@host,不是user@host:2222(后者 shell 会解析失败) - 用户名不同:必须写全
user@host,不能只写host;推送的是谁的authorized_keys,就只能登录谁 - 调试连不上?加
-v看协商过程:ssh -v user@host,重点找Offering public key和Server accepts key
最常被忽略的点:你用 ssh-copy-id user@host 推送,却用 ssh host 登录(隐式走当前用户名),结果当然还是密码提示——公钥只对 user 生效,不跨用户共享。











