ssh‘-i’标志不使用提供的密钥进行身份验证

ssh‘-i’标志不使用提供的密钥进行身份验证

在过去的几个月中,我意识到当我尝试对某个服务器进行身份验证时,ssh 的命令标志“-i”(指指定一个身份文件)无法正常工作。

据我所知,我可以使用此标志指定一个 ssh 密钥来向服务器进行身份验证,从而避免对添加到我的代理的每个密钥进行测试并可能溢出连接尝试。

我现在正在尝试将用户更改为对 git 进行身份验证(问题不是特定于 git 的),并且发生的情况如下:

  • 我有两个用于向 github 验证的 ssh 密钥,我们将它们称为 user1.pem 和 user2.pem。
  • user1.pem 在 github 上对 user1 进行身份验证,user2.pem 对 user2 进行身份验证。
  • 我运行命令“ssh -T[电子邮件保护]",它向用户 1 进行身份验证。
  • 我运行命令“ssh -T -i ~/.ssh/user2.pem[电子邮件保护]",它继续向 user1 进行身份验证。

密钥完全没有问题,两个密钥都已添加到代理中,并且具有正确的文件权限。
为了解决这个问题,我必须从代​​理中删除所有密钥,然后仅重新添加 user2.pem,然后它才能向 user2 进行身份验证。

再次重申,这不是 git 特有的,因为我在常见的 Linux 服务器上也遇到了这个问题,除了在文件中配置主机之外,我找不到任何解决方案~/.ssh/config。我使用 git 作为示例只是因为它更容易测试。

我是否以错误的方式使用了“ssh -i”标志?

答案1

从您问题的描述来看,这与以下选项的缺失有关:man ssh_config

IdentitiesOnly

指定 ssh(1) 应仅使用文件中明确配置的ssh_config或在 ssh(1) 命令行上传递的身份验证身份和证书文件,即使 ssh-agent(1) 或 a PKCS11Provider提供了更多身份。此关键字的参数必须是yesno(默认值)。此选项适用于 ssh-agent 提供许多不同身份的情况。

您可能还启用了AddKeysToAgent选项(很方便),它将自动保留用户1首次使用后装入药剂。

因此你应该运行这个:

ssh -T -o IdentitiesOnly=yes -i ~/.ssh/user2.pem [email protected]

这将阻止身份用户1永远不会被考虑进行身份验证,并强制使用身份用户2

另外(但不太有用),取消设置环境变量SSH_AUTH_SOCK将导致 ssh 代理无法用于该命令。这将产生类似的结果,只是每次都会再次询问您密码,而不是像前一种情况那样,代理在加载后提供解密密钥本身。

相关内容