You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

首次遭遇SSH连接报错“permission denied (publickey)”:指定密钥可连接但常规命令失败求助

解决SSH默认命令无法连接但指定密钥可连接的问题

听起来你遇到的情况确实有点费解——明明密钥配置是对的(指定-i参数能正常连接),但直接用ssh username@host就弹出permission denied (publickey)报错。结合你说客户端只有这一个SSH密钥的情况,大概率是SSH客户端默认不会自动加载非标准命名的密钥文件,咱们一步步排查解决:

核心原因分析

SSH客户端在没有指定-i参数时,会自动尝试加载一系列默认命名的私钥文件,比如:

  • ~/.ssh/id_rsa
  • ~/.ssh/id_ecdsa
  • ~/.ssh/id_ed25519
  • ~/.ssh/id_dsa

如果这次你生成的私钥文件名是private_key(不是上面这些默认名称),哪怕它是客户端唯一的密钥,SSH也不会主动去加载它,这就导致直接连接时没有可用的密钥完成身份验证,从而触发报错。

具体解决方法

方法1:重命名密钥为默认文件名

把你的私钥和对应公钥改成SSH默认识别的名字,比如如果是RSA类型密钥:

# 重命名私钥
mv ~/.ssh/private_key ~/.ssh/id_rsa
# 重命名对应公钥
mv ~/.ssh/private_key.pub ~/.ssh/id_rsa.pub

如果是更安全的Ed25519类型密钥,就改成id_ed25519id_ed25519.pub

改完后务必检查权限(权限不符合要求的话,SSH会拒绝加载密钥):

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa  # 替换成你的私钥实际文件名
chmod 644 ~/.ssh/id_rsa.pub  # 替换成你的公钥实际文件名

之后再尝试ssh username@host,应该就能正常连接了。

方法2:配置SSH Config文件(更灵活,适合多密钥场景)

如果不想修改密钥文件名,可以在~/.ssh/config文件里添加主机配置条目,指定该主机对应的密钥文件:

  1. 打开(或创建)config文件:
notepad ~/.ssh/config  # Windows下用记事本打开,也可用你习惯的编辑器
  1. 添加以下内容(替换成你的实际服务器信息):
Host your_server_alias
    HostName host  # 你的服务器IP或域名
    User username  # 你的服务器登录用户名
    IdentityFile ~/.ssh/private_key  # 你的私钥文件路径

保存后,你既可以用ssh your_server_alias快速连接,也可以直接用ssh username@host——SSH会自动匹配HostName和User,加载对应的密钥。

方法3:用调试日志确认问题

如果还是不确定问题所在,可以用-v参数查看SSH连接的详细日志,看看它尝试加载了哪些密钥:

ssh -v username@host

在输出里找类似这样的内容:

debug1: Trying private key: ~/.ssh/id_rsa
debug1: Trying private key: ~/.ssh/id_ecdsa
debug1: Trying private key: ~/.ssh/id_ed25519

如果看不到加载~/.ssh/private_key的记录,就坐实了是默认不加载自定义命名密钥的问题,用上面两种方法解决即可。

至于你之前多次操作都没问题,应该是之前生成密钥时用了默认文件名(比如没指定-f参数,默认生成id_rsa),这次生成时指定了自定义文件名,才出现这个差异~

内容的提问来源于stack exchange,提问作者mosf

火山引擎 最新活动