062 ssh-copy-id命令
命令说明
ssh-copy-id 把本地 SSH 公钥安全地追加到远程主机的 ~/.ssh/authorized_keys,一条命令完成免密登录配置,比手工复制粘贴公钥更不易出错。
语法
ssh-copy-id [选项]... [用户@]主机
常用参数
| 参数 | 说明 |
|---|---|
| -i 公钥文件 | 指定公钥(默认 ~/.ssh/id_rsa.pub / id_ed25519.pub) |
| -p 端口 | 远程 SSH 端口(默认 22) |
| -n | 干跑模式:只显示将要做的事,不实际写入 |
| -F 配置 | 指定 ssh 配置文件 |
| -o 选项 | 传递 ssh 选项,如首次连接跳过指纹确认 |
| -x 参数 | 传递给远程 shell 的参数 |
使用示例
$ ssh-keygen -t ed25519
前置步骤:本地生成密钥对(已有一对即可跳过)
$ ssh-copy-id root@192.168.1.20
默认公钥写入远端 root 的 authorized_keys
$ ssh-copy-id -i ~/.ssh/deploy.pub deploy@10.0.0.5
指定公钥文件
$ ssh-copy-id -p 2222 user@host
非标端口
$ ssh-copy-id -n user@host
先干跑确认将写入的密钥
$ ssh-copy-id user@hostA; ssh-copy-id user@hostB
给多台机器批量分发公钥
$ ssh user@host
验证:不再提示输密码即免密成功
$ ssh-keygen -y -f ~/.ssh/id_ed25519 | ssh host "cat >> ~/.ssh/authorized_keys"
没有 ssh-copy-id 时(GitBash/旧系统)的手工等价写法
实用技巧
- 免密登录三件套顺序:ssh-keygen 生成 → ssh-copy-id 分发公钥 → ssh 验证;只配公钥不设私钥权限(600)也会失败。
- ssh-copy-id 本质是 ssh 上去执行追加命令,因此第一次仍需密码认证;目标账号被禁密码登录时只能走其他通道送公钥。
- authorized_keys 权限必须 600、~/.ssh 目录 700、家目录不能对组/其他可写,任一不符 sshd 会静默拒绝密钥登录(日志 /var/log/secure 有 Authentication refused)。
- Windows 的 Git Bash/WSL 有 ssh-copy-id,PowerShell 没有,可用上面的 ssh-keygen -y 管道写法替代。
- 批量管理公钥:配置仓库统一维护 authorized_keys 模板,或用 Ansible authorized_key 模块,避免手工逐台 copy-id。
- 撤销访问:删掉远端 authorized_keys 中对应行即可,无需改远端密码。