linux服务器无密码登录不了,核心原因是SSH密钥认证链路中某个环节断了,按“权限→路径→服务→配置→Agent”的顺序排查,多数能在十分钟内解决。SSH免密登录一旦配好本该一劳永逸,但很多人遇到过配置完仍要输密码、甚至直接报错的情况,这通常不是系统坏了,而是权限、文件位置或服务端配置这三处细节出了问题,今天就从实战角度,把可能的原因和排查命令一步步捋清楚。
服务器SSH免密登录配置完了不生效?先查这三处基础项
家目录和authorized_keys权限对不对
权限问题是免密登录失败的最大原因,SSH对密钥文件的权限极其敏感,任何“放得太开”的设置都会被拒绝。
- 在服务器上,对应用户的
~/.ssh目录权限必须为700,属主必须是该用户 ~/.ssh/authorized_keys文件权限必须为600,属主必须是该用户- 用户的家目录权限不能是777或775这种过宽值,建议为700或755
一条命令重置权限:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chown -R $(whoami):$(whoami) ~/.ssh
如果刚才是用root账号帮普通用户放的公钥,普通用户家目录下的文件属主很可能还是root,这一步必须先修正。
公钥到底放进哪个文件了
多数新手把公钥放错了位置,真正生效的文件是~/.ssh/authorized_keys,不是~/.ssh/keys.pub这类自己新建的文件,另外确认公钥内容是一整行且没有被换行截断。
安全起见,不要手动复制粘贴公钥,用自带工具追加:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server_ip
该命令会自动判断远端目录是否存在,并正确处理权限。
检查sshd服务端配置文件
服务器端/etc/ssh/sshd_config里几个关键参数决定了密钥认证是否被允许,逐一确认:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no
改完配置必须重启服务才生效:
systemctl restart sshd
这里有个容易混淆的点:PasswordAuthentication设为no以后,如果密钥又失效,可能连密码登录的机会都没了,所以排查早期先保留yes,确认密钥可用后再关。
排查键盘交互模式卡住和SSH Agent转发失效问题
密钥被锁住了,以及Agent转发链路断裂
有时候公钥、私钥都没问题,但登录时仍提示输入密码,这种情况分两类:
第一,私钥本身有密码保护,且本地ssh-agent没跑起来。 服务器认可你的密钥,但本地私钥是加密存储的,需要你输入私钥密码来解锁,解决方式:
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa
输入一次私钥密码后,会话期间不再重复提示。
第二,用了跳板机批量登录,但Agent转发导致目标服务器不认账。 你从笔记本登录跳板机再登录目标机器,目标机看到的是跳板机上的用户而非你的原始密钥,需要开启转发,在本机~/.ssh/config中加上:
Host jump
HostName 跳板机IP
ForwardAgent yes
登录跳板机后再检查密钥是否被正确转发:
ssh-add -l
列表里有你的私钥指纹,说明转发正常,可以直接从跳板机免密跳到目标,没有输出,说明agent为空,需要重新ssh-add。
客户端和服务端的密钥算法不匹配
这是容易被忽略的一类原因,老服务器SSH版本较低,默认不支持新生成的ed25519密钥;反过来,新版客户端可能默认禁用了旧版服务器的rsa-sha1算法。
- 本地生成的私钥如果是
ssh-rsa签名方式,且客户端OpenSSH版本较新,需要在~/.ssh/config里给该主机单独指定算法:
Host old_server
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
- 服务器端
/etc/ssh/sshd_config同样可以加入兼容参数:
HostKeyAlgorithms +ssh-rsa PubkeyAcceptedAlgorithms +ssh-rsa
这类问题在管理老机房机器或客户旧服务器时最常见,往往查了半天权限没问题,症结其实在算法协商上。
远程服务器无法免密登录排查三板斧
当配置看起来都没问题但死活免密不了,可以在客户端增加详细输出来定位卡在哪一步:
ssh -vvv user@server_ip
重点关注输出里的Authentications that can continue和Offering public key这两行,前者告诉你能用哪些认证方式,后者显示客户端是否真的把密钥递给了服务器。
如果客户端没有发出任何公钥,大概率是本地私钥没被识别或Agent里没有加载,如果服务器收到公钥但拒绝,继续看下一行Authentication refused,则回到权限和服务端配置上查。
实现服务器ssh免密登录时容易忽略的SELinux和目录归属问题
SELinux标签导致公钥文件被拒读
在CentOS、Rocky这类带SELinux的系统上,即使文件权限全对,安全上下文不对同样会被拒绝,将公钥从其他目录拷贝进.ssh时,SELinux上下文可能仍保留原来的标签。
restorecon -Rv ~/.ssh
如果没有restorecon命令,检查SELinux状态:
getenforce
返回Enforcing说明SELinux开启且可能在干预,临时放行测试用setenforce 0,但生产环境建议只修复文件标签,不关SELinux。
root账号和普通用户的免密场景差异
很多人问服务器root用户无密码登录不了怎么办,root用户免密的排查逻辑与普通用户一致,但有两个额外关注点:
- 检查
/etc/ssh/sshd_config中是否设置了PermitRootLogin without-password,默认注释状态下多数发行版禁止root直接密钥登入,需要显式放开 - 确认root的家目录
/root本身不是软链接或挂载点,曾经有个案例把/root挂载到独立盘,SSH直接拒绝读取公钥
多台服务器批量分发密钥时的坑
运维场景里会批量把公钥推到几十台机器上,最容易翻车的是:推送完成后没有在每台机器上验证属主是否一致,批量脚本里用root推送,导致每台机器上目标用户的.ssh属主变成了root,后续各自登录全部失败。
批量分发脚本执行完毕后建议跑一轮校验:
for host in $(cat server_list); do ssh -o BatchMode=yes $host 'ls -ld ~/.ssh ~/.ssh/authorized_keys'; done
这条命令会在每台机器上输出目录和文件的属主、权限,看到root root立刻能定位批量操作导致的问题,不用逐台登录排查。
常见疑问解答:linux免密登录配好了但还要密码怎么办
问:linux服务器无密码登录不了怎么办,最直接的自检顺序是什么?
先看本地私钥是否存在且权限是600:ls -l ~/.ssh/,再用ssh-add -l确认Agent是否装载了密钥,如果都没有问题,到服务器端执行tail -f /var/log/secure,同时从客户端发起一次登录,日志里会直接告诉你被拒原因,不必盲目改配置。
问:服务器ssh密钥登录配置完成后,密码登录也失效了怎么办?
这说明PasswordAuthentication被误设为no,而密钥认证又被SELinux或权限问题挡住,最有效的办法是联系机房或通过云控制台的VNC入口登录服务器,把该项临时改回yes并重启sshd,恢复密码通道后重新排查密钥权限问题。
问:Windows本地生成的密钥为什么总在linux服务器上免密失败?
Windows用户常用ssh-keygen生成密钥后手动改名成authorized_keys,过程中很容易带出多余的空格或换行,个别文本编辑器还会伪造BOM头,建议不要手动编辑公钥文件,直接使用ssh-copy-id或scp传送到服务器后再修改文件名,传送后用awk '{print NF}' authorized_keys查一下字段数,正常应为1,大于1说明内容被空格拆断了。
SSH免密登录的本质是密钥对的信任链问题,每一步都有明确的日志和可验证的状态,权限不对劲修权限,Agent没加载就加载密钥,算法不匹配就补算法参数,SELinux拦路就恢复标签,按这套顺序走一遍,绝大多数无密码登录不了的情况都能自行解决,不必反复重装系统或放弃免密回到密码登录。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/774588.html


