ssh-copy-id 命令 #
ssh-copy-id
是一个用于将本地 SSH 公钥复制到远程服务器的authorized_keys
文件中的实用工具。它简化了设置基于密钥的 SSH 身份验证的过程,使您可以无需密码登录远程服务器。
语法 #
ssh-copy-id [选项] [用户@]主机
常用选项 #
选项 | 描述 |
---|---|
-i 身份文件 |
指定要复制的公钥文件(默认为~/.ssh/id_rsa.pub ) |
-p 端口 |
指定 SSH 连接的端口号(默认为 22) |
-f |
强制模式,即使密钥已存在也继续 |
-n |
仅显示将要执行的操作,不实际执行 |
-o SSH选项 |
传递额外的 SSH 选项 |
常见用法 #
1. 复制默认公钥到远程服务器 #
ssh-copy-id username@hostname
例如:
ssh-copy-id [email protected]
2. 复制指定的公钥文件 #
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@hostname
3. 使用非标准 SSH 端口 #
ssh-copy-id -p 2222 username@hostname
4. 复制公钥并传递额外的 SSH 选项 #
ssh-copy-id -o "StrictHostKeyChecking=no" username@hostname
5. 预览将要执行的操作(不实际复制) #
ssh-copy-id -n username@hostname
工作原理 #
ssh-copy-id
命令执行以下操作:
- 读取指定的公钥文件(默认为
~/.ssh/id_rsa.pub
) - 使用 SSH 连接到远程服务器(需要输入密码)
- 确保远程服务器上存在
~/.ssh
目录,如果不存在则创建 - 将公钥添加到远程服务器的
~/.ssh/authorized_keys
文件中 - 设置适当的文件权限(
~/.ssh
目录为 700,authorized_keys
文件为 600)
手动替代方法 #
如果ssh-copy-id
不可用,可以手动执行相同的操作:
cat ~/.ssh/id_rsa.pub | ssh username@hostname "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
常见问题排查 #
1. 权限问题 #
如果遇到权限错误,确保本地和远程的 SSH 目录和文件权限正确:
~/.ssh
目录:权限应为 700(只有所有者可以读、写和执行)~/.ssh/authorized_keys
文件:权限应为 600(只有所有者可以读和写)
2. 公钥已存在 #
如果公钥已经存在于远程服务器的authorized_keys
文件中,ssh-copy-id
会检测到并避免重复添加。如果需要强制添加,可以使用-f
选项。
3. SSH 服务器配置问题 #
如果ssh-copy-id
成功但仍然无法使用密钥登录,检查 SSH 服务器的配置:
ssh -v username@hostname
确保服务器配置(/etc/ssh/sshd_config
)允许公钥认证:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
安全最佳实践 #
- 使用强密钥类型和长度(如 RSA 4096 位或 ED25519)
- 为密钥设置密码短语,增加额外的安全层
- 定期轮换 SSH 密钥
- 在设置密钥认证后,考虑禁用密码认证
- 使用
ssh-agent
管理密钥,避免重复输入密码短语
提示 #
- 在设置密钥认证后,尝试新的 SSH 连接前不要关闭现有的 SSH 会话,以防配置错误导致无法连接
- 使用
ssh-keygen -l -f ~/.ssh/id_rsa.pub
可以查看公钥的指纹,用于验证 - 对于多台服务器,可以创建一个脚本批量部署公钥
- 结合
ssh-keygen
和ssh-copy-id
可以快速设置新的 SSH 密钥认证 - 使用
ssh-copy-id
比手动复制公钥更安全,因为它会自动设置正确的文件权限