如何配置 SSH 以使其不会自动尝试所有身份文件?

如何配置 SSH 以使其不会自动尝试所有身份文件?

我一直将 ssh 身份文件放在我的~/.ssh/文件夹中。里面大概有 30 个文件。

当我连接到服务器时,我将指定要使用的标识文件,例如

ssh -i ~/.ssh/client1-身份[电子邮件保护]

但是,如果我不指定身份文件,而只是使用如下内容:

远程控制[电子邮件保护]

我得到了错误

用户 123 的身份验证失败次数过多

我理解这是因为如果没有指定身份文件,并且 ssh 可以找到身份文件,那么它将尝试所有身份文件。

我还了解我可以编辑该~/.ssh/config文件并指定类似的内容:

主机 example.com
PreferredAuthentications 键盘交互,密码

以防止该连接尝试已知的身份文件。

因此,我想我可以将身份文件移出目录~/.ssh/,或者我可以在配置文件中指定要禁用身份文件身份验证的每个主机,但是有没有办法告诉 SSH 默认不要搜索身份文件? 或者指定它将搜索的文件?

答案1

您可以将IdentitiesOnly=yes选项与IdentityFile(参见ssh_config 手册页)。这样,您就可以指定它应该查找哪些文件。

在此示例中,ssh 将仅有的查看 ssh_config 文件中给出的身份 + 命令行中列出的 4 个身份(代理提供的身份将被忽略):

ssh -o IdentitiesOnly=yes \
    -o IdentityFile=id1.key \
    -o IdentityFile=id2.key \
    -i id3.key \
    -i id4.key \
    [email protected]

形式-i-o IdentityFile=可以互换。

在中.ssh/config,您可以包含如下配置:

Host example
User user123
Hostname example.com
IdentityFile ~/.ssh/id_rsa_example
IdentityFile ~/.ssh/id_rsa_example2
IdentitiesOnly yes

答案2

user76528 的简短回答是正确的,但我刚遇到这个问题,觉得详细说明一下会很有用。如果您想知道“为什么 ssh 会忽略我的identityfile配置选项”,您可能也会关心这个解决方案?

首先,与 ssh_config 中的其他选项不同,ssh 不会使用IdentityFile它找到的第一个选项。相反,该IdentityFile选项会将该文件添加到使用的身份列表中。您可以堆叠多个IdentityFile选项,ssh 客户端将尝试所有选项,直到服务器接受一个选项或拒绝连接。

其次,如果您使用 ssh-agent,即使您没有使用 in (或 )选项指定密钥,ssh 也会自动尝试使用代理中的密钥ssh_configIdentityFile-i是您可能收到错误的常见原因Too many authentication failures for user。使用IdentitiesOnly yes选项将禁用此行为。

如果您以多个用户身份通过​​ ssh 连接到多个系统,我建议您将IdentitiesOnly yes其放入 的全局部分ssh_config,并将每个部分放入IdentityFile相应的主机子部分中。

答案3

我一般这样做:

$ ssh -o IdentitiesOnly=yes -F /dev/null -i ~/path/to/some_id_rsa [email protected]

选项如下:

  • -o IdentitiesOnly=yes- 告诉 SSH 仅使用通过 CLI 提供的密钥,而不使用来自$HOME/.ssh或通过 ssh-agent提供的密钥
  • -F /dev/null- 禁止使用$HOME/.ssh/config
  • -i ~/path/to/some_id_rsa- 您明确想要用于连接的密钥

例子

$ ssh -v -o IdentitiesOnly=yes -F /dev/null -i ~/my_id_rsa [email protected]
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /dev/null
debug1: Connecting to someserver.mydom.com [10.128.12.124] port 22.
debug1: Connection established.
debug1: identity file /Users/sammingolelli/my_id_rsa type 1
debug1: identity file /Users/sammingolelli/my_id_rsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH_5*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA f5:60:30:71:8c:a3:da:a3:fe:b1:6d:0b:20:87:23:e1
debug1: Host 'someserver' is known and matches the RSA host key.
debug1: Found key in /Users/sammingolelli/.ssh/known_hosts:103
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammingolelli/my_id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Authenticated to someserver.mydom.com ([10.128.12.124]:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
Last login: Tue Dec  8 19:03:24 2015 from 153.65.219.15
someserver$

请注意,上面的输出ssh仅通过 CLI 识别了my_id_rsa私钥,并使用它来连接到某个服务器。

具体来说,这些部分:

debug1: identity file /Users/sammingolelli/my_id_rsa type 1
debug1: identity file /Users/sammingolelli/my_id_rsa-cert type -1

和:

debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammingolelli/my_id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).

答案4

使用 IdentityFile 但继续使用 ssh-agent 来避免密码重新提示

接受的解决方案IdentitiesOnly yes意味着您将永远无法利用 ssh-agent,导致在加载密钥时重复提示您输入密码。

要继续使用ssh-agent并避免“身份验证失败次数过多”错误,请尝试以下操作:

  1. 删除所有自动将密钥加载到的交互式控制台启动脚本ssh-agent

  2. 添加AddKeysToAgent yes到客户端的 ssh 配置中。这将在第一次连接时提示您输入密码,然后将密钥添加到您的代理。

  3. 当您收到“过多身份验证”错误时使用ssh-add -D。这只会“重置”(删除)您的 ssh-agent 缓存。然后在同一会话中再次尝试连接。系统将提示您输入密码,一旦接受,它将被添加到您的代理中。由于您的代理中只有一个密钥,因此您将被允许连接。然后 ssh-agent 在同一会话期间仍可用于将来的连接,以避免重新提示。

    Host ex example.com
       User joe
       HostName example.com
       PreferredAuthentications publickey,password
       IdentityFile /path/to/id_rsa
       AddKeysToAgent yes
    

相关内容