我一直将ssh身份文件放入~/.ssh/文件夹中。我可能在那里大约有30个文件。

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

ssh -i ~/.ssh/client1-identity client1@10.1.1.10


但是,如果我未指定身份文件,而只是使用类似这样的内容:

ssh user123@example.com


我得到错误
Too many authentication failures for user123


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

我也理解我可以编辑~/.ssh/config文件并指定像这样:

Host example.com
PreferredAuthentications keyboard-interactive,password


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

所以,我想我可以移动身份文件在~/.ssh/目录之外,或者我可以在配置文件中指定要禁用身份文件身份验证的每个主机,但是有什么方法可以告诉SSH默认情况下不搜索身份文件?还是指定要搜索的内容?

评论

关于“我明白这是因为...”-使用ssh -v可以确定。

#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 \
    user123@example.com

形式-i-o IdentityFile=是可互换的。
.ssh/config中,您可以包含如下配置:
Host example
User user123
Hostname example.com
IdentityFile ~/.ssh/id_rsa_example
IdentityFile ~/.ssh/id_rsa_example2
IdentitiesOnly yes


评论


一个例子会很好

–rubo77
14年8月14日在5:49

是不是:IdentitiesOnly是(没有“ =”)?

– Dimitrios Mistriotis
16 Dec 28'在10:18

@DimitriosMistriotis根据ssh_config手册页,两种方法都可以接受:配置选项可以用空格或可选的空格分隔,并且只能是一个'=';使用ssh,scp和sftp -o选项指定配置选项时,后一种格式非常有用,可以避免使用引号引起来。

–尼克·安德列格(Nick Anderegg)
16年12月31日在19:30

身份仅可能并不总是有效,您可能必须专门排除主机;参见superuser.com/questions/859661/…

– aexl
19-10-2在8:39

**如果您的SSH代理仍在提示您输入密码,请参见以下答案。

–user541686
20-05-21在12:43

#2 楼

user76528的简短答案是正确的,但我只是遇到了这个问题,并认为进行一些详细说明会很有用。如果您想知道“ ssh为什么忽略我的identityfile配置选项”,您可能还会关心此解决方案?

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

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

如果将ssh作为多个用户使用SSH到多个系统,建议将IdentitiesOnly yes放在ssh_config的全局部分中,并将每个IdentityFile放在相应的Host子部分中。 />

评论


很好地解释了,谢谢。参数'IdentitiesOnly'并不意味着TakeOnlyWhatIExplicitlySpecifyThenFailoverToPassword。并且显然,。/ ssh / id_rsa密钥仍被列出。

–lImbus
2014年1月9日在13:14



将身份放在ssh_config的global部分中是对我有用的。谢谢!

– jamix
15年3月20日在11:04

感谢您的详细评论。我曾经使用('\'代表换行符)Host * \ IdentityFile〜/ .ssh / mykey作为配置选项,起初看起来很奇怪,对于一个特定的站点有一个不同的条目,例如主机特殊\ IdentityFile〜/ .ssh / specialkey \ IdentitiesOnly是继续提供mykey而不是specialkey。当然还不清楚,直到我意识到(根据您的回答)IdentityFile条目按评估顺序堆叠在一起,并且将使用最后定义的条目。删除IdentityFile〜/ .ssh / mykey解决了此问题,并使用了正确的单个密钥。

–莱德
2015年10月5日在15:28

在尝试此操作之前,我注意到我的git pull / push命令正在尝试加载代理中的每个身份。直到有一点我有太多的钥匙,这才不是问题。

–sdkks
18 Mar 26 '18在3:06

#3 楼

我通常这样做:

$ ssh -o IdentitiesOnly=yes -F /dev/null -i ~/path/to/some_id_rsa root@server.mydom.com


选项如下:



-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 root@someserver.mydom.com
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 no-more-sessions@openssh.com
debug1: Entering interactive session.
Last login: Tue Dec  8 19:03:24 2015 from 153.65.219.15
someserver$


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

特别是以下部分:

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).


评论


谢谢,这是唯一完整的解决方案。显然,-F / dev / null是其他答案中缺少的部分。

–leden
16 Dec 16'3:36

#4 楼

在您有很多密钥的情况下,您总是会遇到“ Too many Authentication Failures”错误。如果您有密码,并且只想使用密码进行登录,请按以下步骤操作。

仅使用密码身份验证而不使用公钥,并且不要使用带有误导性的“键盘交互式”(这是包括密码的超集),您可以从命令行执行此操作:

ssh -o PreferredAuthentications=password user@example.com


#5 楼

使用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




评论


会接受添加到钥匙串的钥匙吗?

–vfclists
17年9月19日在13:00

#6 楼

ssh客户端和ssh-agent正在通过Unix域套接字进行通信,该套接字的名称由SSH_AUTH_SOCK环境变量(由代理在启动时设置)指定给客户端。

因此,防止单次调用客户端查询代理程序时,可以将该变量显式设置为无效值,例如空字符串;

$ SSH_AUTH_SOCK= ssh user@server


像这样的客户端调用将无法与代理程序通信并且只能向服务器提供~/.ssh/中的可用身份或文件中使用-i在命令行中指定的身份。

debug1: pubkey_prepare: ssh_get_authentication_socket: Connection refused


评论


这是一个很好的答案。当您使用“在幕后”使用SSH的命令(如git)时,它很简单且有效。可惜我不能再投票了。

–rsuarez
19年8月7日在15:10

+1如果需要在配置文件中将IdentityAgent设置为none,则将其设置为none。

–user541686
20-05-21在12:42

#7 楼

~/.ssh/config文件的末尾添加此代码可防止非配置服务器使用密钥:

Host *
IdentitiesOnly=yes


#8 楼

您一直(几乎)都有答案:

Host *
PreferredAuthentications keyboard-interactive,password


为我工作。

评论


该问题询问有关如何限制使用哪些公共密钥的问题。此答案将完全禁用公共密钥身份验证。

–chrishiestand
2012年6月12日22:11在

我+1了,因为这是我正在谷歌搜索的答案,谢谢@Henry Grebler

–马蒂乌
2012年7月24日在6:19