ssh-copy-id仅将本地公钥安全追加至远程~/.ssh/authorized_keys并尝试修复权限,需预先生成密钥、确保sshd启用pubkeyauthentication、严格校验家目录(755)、.ssh目录(700)及authorized_keys文件(600)权限,并正确使用-p指定端口、完整用户名及-v调试。

ssh-copy-id 不是“一键搞定所有”的魔法命令,它只做一件事:把本地公钥安全地追加进远程用户的 ~/.ssh/authorized_keys 文件,并尝试设好权限。要让它真正起作用,得先铺好几条路。
确保本地已有可用的公钥
ssh-copy-id 不会帮你生成密钥,它只找默认路径(如 ~/.ssh/id_ed25519.pub 或 ~/.ssh/id_rsa.pub)下的公钥文件。
- 运行
ls -l ~/.ssh/id_*.pub看是否有输出;没有就先生成:ssh-keygen -t ed25519 -C "your@email.com"(推荐)或ssh-keygen -t rsa -b 4096 - 如果用了自定义名字(比如
mykey.pub),必须显式指定:ssh-copy-id -i ~/.ssh/mykey.pub user@host
确认远程服务端已准备好
公钥推过去了,不代表就能登录——sshd 得认这个机制,且权限不能出错。
- 检查远程主机的
/etc/ssh/sshd_config:确保有PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys,且未被注释 - 改完配置后必须重启服务:
sudo systemctl restart sshd - 若系统启用了 SELinux(常见于 CentOS/RHEL),推送后执行
restorecon -Rv ~/.ssh重置安全上下文
严格校验三处权限
OpenSSH 对权限极其敏感,任意一级宽松都会静默拒绝公钥验证。
- 远程用户家目录:
chmod 755 ~(不能是 777、775 或带 sticky bit) -
~/.ssh目录:chmod 700 ~/.ssh -
~/.ssh/authorized_keys文件:chmod 600 ~/.ssh/authorized_keys - 注意:ssh-copy-id 尝试设权但失败不报错,推送后务必手动检查
正确调用命令,避免常见格式错误
语法和 ssh 一致,但容易写错端口和用户名。
- 非标准端口(如 2222):用
-p 2222,不是user@host:2222(后者 shell 会解析失败) - 用户名必须写全:
ssh-copy-id admin@192.168.1.100,不能只写192.168.1.100 - 调试连不上?加
-v查看协商过程:ssh -v admin@192.168.1.100,重点找Offering public key和Server accepts key - 别混淆用户:你用
admin@host推送,就必须用ssh admin@host登录;用ssh host默认走当前用户名,不会命中刚传的公钥











