排错

SSH "Permission denied (publickey)":怎么修

Permission denied (publickey) 意味着服务器拒绝了你的认证。按可能性排序的五个原因——用户名、没递密钥、authorized_keys、权限、服务器配置——和确切的修法。

CC Chen Chen· 创始人·2026 年 6 月 11 日·阅读 6 分钟

"Permission denied (publickey)" 是什么意思

这个报错的意思是服务器拒绝了你的认证——网络连接是通的,但服务器不接受你客户端递上来的任何凭证。括号里写 (publickey),说明服务器只允许密钥认证、而你的密钥一把都没匹配上。它几乎总是五个原因之一:用户名错、客户端没递对密钥、公钥不在服务器上、~/.ssh 权限不对、或服务器配置不允许你的认证方式。下面教你几分钟定位是哪一个。

五个原因,按可能性排序

#原因快速检查
1用户名错了ubunturootpi 还是 ec2-user?云镜像各不相同
2客户端没递对密钥连接设置里真的选了密钥吗?
3公钥不在 authorized_keys这台服务器上装过这把公钥吗?
4服务器上权限太开放~/.ssh 必须 700,authorized_keys 必须 600
5服务器配置不允许PasswordAuthentication no + 没装密钥

1——先查用户名

最常见的原因,尤其在云服务器上:每种镜像有自己的默认用户——ubuntu(Ubuntu)、ec2-user(Amazon Linux)、root(很多 VPS 镜像)、pi(老版树莓派系统)、debianadmin……用户名错了,服务器在看你的密钥之前就拒绝了,报错长得一模一样。

2——确认递的是对的密钥

桌面上,ssh -v user@host 会显示客户端尝试了哪些密钥("Offering public key…")。移动客户端里,打开连接设置确认这条连接真的挂了密钥——一条"用密码"建的连接根本不会递密钥。在 TermAI 里,编辑连接、把认证切到你的密钥。

3——把公钥装到服务器上

服务器只接受列在你登录的那个用户~/.ssh/authorized_keys 里的密钥。如果你还有别的方式能进去(密码、控制台):

# 从一台能登录的机器:
ssh-copy-id user@host
# 或手动追加你的公钥:
cat your_key.pub >> ~/.ssh/authorized_keys

在手机上,TermAI 能替你做:它生成 Ed25519 密钥,并有一键部署到服务器,通过现有的可用登录把公钥写进 authorized_keys。注意:密钥装在特定用户的家目录下——给 root 装了,不等于能用 ubuntu 登录。

4——修服务器上的权限

文件或目录权限太开放时,OpenSSH 会默默忽略 authorized_keys。在服务器上:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh

也检查家目录本身没有组/全员可写。这就是经典的"密钥装了还是失败"的原因——看服务器的 /var/log/auth.log,它会记"Authentication refused: bad ownership or modes"。

5——看服务器允许什么

/etc/ssh/sshd_config 里:如果 PasswordAuthentication no 而你的密钥没装,你就被锁在失败的路上;如果 PermitRootLogin no 而你在试 root,那就是拒绝的来源。改配置(或用对的用户),然后 sudo systemctl restart ssh。见安全地禁用 root 登录

在手机上排查

这个错在手机上撞见时,痛苦的是读冗长的报错、记诊断命令。只要你对这台机器还有任何能用的会话,选中报错输出问助手——TermAI 的 AI 读真实的报错和服务器上下文,告诉你是五个原因里的哪一个,并给出可复核再运行的确切修复命令。

TermAI 的 AI 助手解释一个 SSH 报错并建议修复命令
选中报错、问 AI:贴着实时服务器,它能分清是权限问题还是缺密钥,并给出确切的 chmod/ssh-copy-id。

常见问题

Permission denied (publickey) 是什么意思?
服务器只接受 SSH 密钥认证,而你客户端递的密钥都没匹配。按顺序查:用户名、密钥选择、authorized_keys、权限。

为什么我装了密钥还是失败?
通常是权限:~/.ssh 必须 700、authorized_keys 必须 600,且归登录用户所有。或者密钥装在了另一个用户名下。

怎么看到底是什么在失败?
桌面上跑 ssh -v user@host;服务器上看 /var/log/auth.log(或 journalctl -u ssh)——它会明确写出原因。

能从手机上修吗?
能,只要你还有任何能进去的方式(密码登录或另一把密钥)。TermAI 能一键把新密钥部署到服务器,它的 AI 也能诊断 auth.log 输出。

快速事实

  • 含义:服务器拒绝认证——没有递上的密钥匹配(是认证问题,不是网络)
  • 主因:用户名错 · 没递密钥 · 不在 authorized_keys · 权限不对 · 服务器配置
  • 权限:~/.ssh 700,authorized_keys 600
  • 看真实原因:客户端 ssh -v,服务器端 /var/log/auth.log
Try TermAI

Free on iOS and Android. 5 AI requests/day on the free tier, plus unlimited SSH/SFTP and built-in Tailscale.

CC
Chen Chen — Founder of TermAI

Writes about mobile DevOps, terminal UX, and the surprising depth of "boring" infrastructure.

Was this useful? ← Back to blog