能实现真正免密登录,前提是生成密钥时留空passphrase:用ssh-keygen -t ed25519 -C "you@example.com"并回车两次跳过密码设置;若已设密码,可用ssh-keygen -p -f ~/.ssh/id_ed25519清空。

能,但前提是远端服务器已启用公钥认证且你本地私钥未设密码(passphrase)——否则每次连接仍要输 passphrase,不算真正“免密”。
ssh-keygen 生成密钥对时必须留空 passphrase
很多失败都卡在这一步:生成密钥时误输或默认填了密码。一旦设置了 passphrase,ssh 连接时就会停在输入框等你敲密码,哪怕远端配置全对也没用。
- 正确做法:
ssh-keygen -t ed25519 -C "you@example.com",遇到Enter passphrase提示直接回车两次(留空) - 如果已生成带 passphrase 的密钥,可用
ssh-keygen -p -f ~/.ssh/id_ed25519清空它(过程中输入旧 passphrase,新 passphrase 直接回车) - ed25519 比 rsa 更快更安全,除非远端 SSH 版本太老(-t rsa -b 4096
ssh-copy-id 失败后必须手动检查远程 ~/.ssh 权限
ssh-copy-id 只负责把公钥追加进 authorized_keys,不保证目录和文件权限正确。而 OpenSSH 对权限极其敏感:只要 ~/.ssh 不是 700 或 authorized_keys 不是 600,认证立刻静默失败(连错误提示都不给)。
- 登录远端后立即执行:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys - 确认用户家目录本身不能是 777(比如挂载的 NFS 卷),否则 SSH 会拒绝读取
authorized_keys - 若用 root 登录远端,注意
~指向的是/root;若用普通用户,确保其~/.ssh所属用户和组一致(chown $USER:$USER ~/.ssh)
远端 sshd_config 必须显式开启 PubkeyAuthentication
有些系统(如某些 CentOS 镜像或云厂商定制版)默认关闭公钥认证,仅靠 ssh-copy-id 推送公钥完全没用。
- 远端执行:
sudo grep -E "^(PubkeyAuthentication|AuthorizedKeysFile)" /etc/ssh/sshd_config - 必须看到:
PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys(路径不能被注释) - 改完务必重启服务:
sudo systemctl restart sshd(Ubuntu/Debian)或sudo systemctl restart sshd(CentOS/RHEL) - 禁用密码登录前先测试免密成功,否则可能把自己锁在外面
最常被忽略的其实是远端 /etc/ssh/sshd_config 里那行被注释掉的 PubkeyAuthentication,以及本地生成密钥时手抖多按了一个回车导致 passphrase 实际不为空——这两点占了所有“明明照着做却连不上”的 80% 以上。











