如何通过SSH-Key在Linux上实现远程服务器无密码登录设置?
- 内容介绍
- 文章标签
- 相关推荐
本文共计721个文字,预计阅读时间需要3分钟。
可以直接使用 `ssh-copy-id` 命令,无需手动拼接连接命令。它自动处理目录创建、权限设置和追加逻辑,减少了出错的可能性。
为什么 ssh-copy-id 失败后不能直接改用 cat ... | ssh ... >> authorized_keys
这个管道命令看似等价,但实际会破坏 authorized_keys 文件的末尾换行符,导致第二条公钥写入时粘连在第一行末尾,SSH 拒绝加载整个文件。更隐蔽的问题是:如果目标用户 ~/.ssh 目录不存在,该命令不会创建它,而 ssh-copy-id 会自动执行 mkdir -p ~/.ssh && chmod 700 ~/.ssh。常见错误现象包括登录时提示 Permission denied (publickey),但 sshd -T | grep pubkey 显示配置正常——问题往往就出在这儿。
id_rsa.pub 内容必须逐行追加,不能覆盖 authorized_keys
多人共用一台目标服务器时,直接用 scp 替换整个 authorized_keys 文件会踢掉其他人的免密权限。正确做法永远是追加:
ssh user@host 'mkdir -p ~/.ssh && chmod 700 ~/.ssh'cat ~/.ssh/id_rsa.pub | ssh user@host 'cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
注意:authorized_keys 权限必须是 600(即 -rw-------),.ssh 目录必须是 700(即 drwx------)。OpenSSH 7.0+ 版本会严格校验这两项,不满足则静默拒绝公钥认证。
私钥路径不是默认时,ssh 命令必须显式指定 -i
如果你用 ssh-keygen -f /path/to/mykey 指定了非默认路径,后续登录必须带 -i 参数,否则 SSH 客户端根本不会加载它:
ssh -i /path/to/mykey user@host
漏掉 -i 是最常被忽略的操作点——用户反复确认公钥已写入、权限已修正、服务已重启,却始终要输密码,原因就是客户端压根没用那把私钥。另外,~/.ssh/config 中可通过 IdentityFile 配置避免每次敲 -i,但首次验证务必先用显式参数跑通。
真正的难点不在生成密钥,而在权限链的完整性:本地私钥可读、目标 .ssh 目录可访问、authorized_keys 可读且格式干净、sshd 配置未被其他策略覆盖(比如 PAM 模块强制要求密码)。任何一环断开,错误提示都统一显示为 Permission denied (publickey),没有更多线索。
本文共计721个文字,预计阅读时间需要3分钟。
可以直接使用 `ssh-copy-id` 命令,无需手动拼接连接命令。它自动处理目录创建、权限设置和追加逻辑,减少了出错的可能性。
为什么 ssh-copy-id 失败后不能直接改用 cat ... | ssh ... >> authorized_keys
这个管道命令看似等价,但实际会破坏 authorized_keys 文件的末尾换行符,导致第二条公钥写入时粘连在第一行末尾,SSH 拒绝加载整个文件。更隐蔽的问题是:如果目标用户 ~/.ssh 目录不存在,该命令不会创建它,而 ssh-copy-id 会自动执行 mkdir -p ~/.ssh && chmod 700 ~/.ssh。常见错误现象包括登录时提示 Permission denied (publickey),但 sshd -T | grep pubkey 显示配置正常——问题往往就出在这儿。
id_rsa.pub 内容必须逐行追加,不能覆盖 authorized_keys
多人共用一台目标服务器时,直接用 scp 替换整个 authorized_keys 文件会踢掉其他人的免密权限。正确做法永远是追加:
ssh user@host 'mkdir -p ~/.ssh && chmod 700 ~/.ssh'cat ~/.ssh/id_rsa.pub | ssh user@host 'cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
注意:authorized_keys 权限必须是 600(即 -rw-------),.ssh 目录必须是 700(即 drwx------)。OpenSSH 7.0+ 版本会严格校验这两项,不满足则静默拒绝公钥认证。
私钥路径不是默认时,ssh 命令必须显式指定 -i
如果你用 ssh-keygen -f /path/to/mykey 指定了非默认路径,后续登录必须带 -i 参数,否则 SSH 客户端根本不会加载它:
ssh -i /path/to/mykey user@host
漏掉 -i 是最常被忽略的操作点——用户反复确认公钥已写入、权限已修正、服务已重启,却始终要输密码,原因就是客户端压根没用那把私钥。另外,~/.ssh/config 中可通过 IdentityFile 配置避免每次敲 -i,但首次验证务必先用显式参数跑通。
真正的难点不在生成密钥,而在权限链的完整性:本地私钥可读、目标 .ssh 目录可访问、authorized_keys 可读且格式干净、sshd 配置未被其他策略覆盖(比如 PAM 模块强制要求密码)。任何一环断开,错误提示都统一显示为 Permission denied (publickey),没有更多线索。

