![如何配置 SSH 以使其不会自动尝试所有身份文件?](https://linux22.com/image/1271671/%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%20SSH%20%E4%BB%A5%E4%BD%BF%E5%85%B6%E4%B8%8D%E4%BC%9A%E8%87%AA%E5%8A%A8%E5%B0%9D%E8%AF%95%E6%89%80%E6%9C%89%E8%BA%AB%E4%BB%BD%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我一直将 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_config
。IdentityFile
这-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
并避免“身份验证失败次数过多”错误,请尝试以下操作:
删除所有自动将密钥加载到的交互式控制台启动脚本
ssh-agent
。添加
AddKeysToAgent yes
到客户端的 ssh 配置中。这将在第一次连接时提示您输入密码,然后将密钥添加到您的代理。当您收到“过多身份验证”错误时使用
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