什么是 SSH 免密登录,适用哪些场景
SSH 免密登录指的是通过 SSH 密钥对(公钥 + 私钥)代替密码进行身份验证的登录方式。配置完成后,每次连接服务器不再需要输入密码,客户端会使用本地保存的私钥与服务器上的公钥进行匹配验证,验证通过即可直接登录。
这种方式特别适合以下场景:站长或运维需要每天多次登录自己的云服务器管理网站;开发者需要频繁向测试服务器部署代码;企业运维需要在多台服务器之间批量执行命令或做自动化备份。凡是需要反复连接 Linux 服务器的场景,配置免密登录都能明显提升效率,同时比弱密码更安全。
免密登录的原理:公钥与私钥如何配合工作
SSH 密钥对由两部分组成:私钥保存在你自己的电脑上,绝对不能泄露给任何人;公钥则上传到服务器的 ~/.ssh/authorized_keys 文件中。登录时,服务器会用公钥发起一个数学挑战,客户端用私钥完成签名响应,整个过程不传输私钥本身,因此即使连接被监听也不会泄露密钥。
理解这一点很重要:免密登录的安全性完全取决于私钥的保管。建议在生成密钥时设置一个 passphrase(密钥口令),这样即使私钥文件被复制,他人也无法直接使用。日常配合 ssh-agent 使用,可以做到一次输入口令、后续自动解密,兼顾安全与便捷。
第一步:在本地电脑生成 SSH 密钥对
在 Windows 10/11 的 PowerShell、macOS 或 Linux 的终端中执行以下命令:
ssh-keygen -t ed25519 -C "your_email@example.com"
参数说明:-t ed25519 指定使用 Ed25519 算法,安全性和性能都优于传统的 RSA;如果你的服务器系统较老不支持 Ed25519,可以改用 ssh-keygen -t rsa -b 4096。执行后系统会提示保存路径,默认回车即可(Windows 下为 C:\Users\你的用户名\.ssh\id_ed25519)。
接下来会提示输入 passphrase,可以直接回车留空,也可以设置一个口令。设置口令更安全,留空则登录更省事,请根据实际安全要求权衡。命令执行完成后,.ssh 目录下会生成两个文件:id_ed25519(私钥,留在本地)和 id_ed25519.pub(公钥,用于上传服务器)。
第二步:把公钥上传到服务器
最简单的方式是使用 OpenSSH 自带的复制命令(macOS/Linux 或 Windows 10 1809 以上版本均支持):
ssh-copy-id root@你的服务器IP
执行时会要求输入一次该服务器的登录密码,输入正确后公钥会自动写入服务器的 ~/.ssh/authorized_keys 文件。如果该命令不可用,也可以手动操作:先用 cat ~/.ssh/id_ed25519.pub 查看公钥内容并复制,然后登录服务器执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
权限设置非常关键:.ssh 目录必须是 700,authorized_keys 必须是 600,否则 sshd 出于安全考虑会拒绝读取公钥,导致免密登录配置好却依然提示输密码。这是新手最常见的坑之一。

第三步:验证免密登录并测试连接
配置完成后,不要关闭当前的登录会话,先新开一个终端窗口测试:
ssh root@你的服务器IP
如果不再提示输入密码、直接进入服务器,说明免密登录已生效。保留旧会话是为了在配置出错时仍能通过原会话修复,避免把自己锁在服务器外面。如果希望进一步简化命令,可以在本地 ~/.ssh/config(Windows 路径为 C:\Users\你的用户名\.ssh\config)中添加别名配置:
Host myserver
HostName 你的服务器IP
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
保存后只需输入 ssh myserver 即可连接,多台服务器管理起来非常方便。
第四步(可选):关闭密码登录提升安全性
确认免密登录稳定可用后,可以关闭服务器的密码登录,从根本上杜绝密码爆破攻击。编辑服务器上的 /etc/ssh/sshd_config:
PasswordAuthentication no
PubkeyAuthentication yes
修改后重启 sshd 服务(CentOS 为 systemctl restart sshd,Ubuntu/Debian 为 systemctl restart ssh)。重要提醒:重启前请务必确认免密登录已经测试成功,并且保留当前已登录的会话不要退出;云服务器建议同时确认控制台的 VNC 救援登录可用,以防配置失误导致无法远程连接。如果服务器上有其他人也在使用密码登录,请先通知他们配置好密钥再执行此操作。
常见问题排查(FAQ)
1. 配置了公钥却仍然要求输入密码?最常见的原因是权限不对:依次在服务器上执行 chmod 700 ~/.ssh 和 chmod 600 ~/.ssh/authorized_keys;其次检查 authorized_keys 中公钥是否完整(必须一整行,不能换行断开);还要确认家目录权限不能是 777,必要时执行 chmod 755 ~。可以查看服务器日志 /var/log/secure 或 /var/log/auth.log 中的 Authentication refused 记录定位原因。
2. 提示 Permission denied (publickey)?表示服务器只接受密钥认证但验证失败。检查本地私钥路径是否与 ssh -v root@IP 输出中尝试加载的文件一致;确认登录用户与公钥所在的家目录对应(给 root 配的公钥不能用于 ubuntu 用户登录);必要时在 ssh 命令后加 -i 私钥路径 显式指定密钥。
3. 换了电脑或重装系统后无法登录怎么办?私钥是唯一的,如果旧私钥丢失且服务器已关闭密码登录,需要通过云服务商控制台的 VNC 救援登录进入服务器,重新向 ~/.ssh/authorized_keys 追加新公钥,或临时恢复 PasswordAuthentication yes。这也是强烈建议在关闭密码登录前确保救援通道可用的原因。
4. 密钥口令(passphrase)每次都要输入很麻烦?可以使用 ssh-agent 缓存私钥:macOS/Linux 执行 eval $(ssh-agent) 后 ssh-add ~/.ssh/id_ed25519,输入一次口令后当前会话内不再询问;Windows 下 OpenSSH Authentication Agent 服务默认可用,配合 ssh-add 命令同样可以缓存。
总结
SSH 免密登录只需三步核心操作:本地生成密钥对、把公钥写入服务器 authorized_keys、测试连接成功。整个过程中最需要留意的是文件权限(700/600)和私钥的妥善保管。配置稳定后,建议进一步关闭密码登录并配合 ~/.ssh/config 别名管理多台服务器,既能提升日常运维效率,也能显著增强服务器的安全防护能力。操作涉及 sshd 配置修改时,请务必先测试密钥可用、保留已登录会话,并提前做好回退方案。












暂无评论内容