像大多数系统管理员一样,我始终使用 openssh。我有大约十几个 ssh 密钥,我喜欢为每个主机使用不同的 ssh 密钥。但是,当我第一次连接到主机时,这会导致问题,而我只有一个密码。在这种情况下,我只想使用密码连接到主机,而不需要 ssh 密钥。但是,ssh 客户端将提供我的所有公钥~/.ssh/
(我从查看 的输出中知道这一点ssh -v
)。由于我有这么多公钥,我会因为太多次身份验证失败而断开连接。
有没有什么方法可以告诉我的 ssh 客户端不要提供所有的 ssh 密钥?
答案1
根据手册页,这是预期的行为ssh_config
:
IdentityFile
Specifies a file from which the user's DSA, ECDSA or DSA authentica‐
tion identity is read. The default is ~/.ssh/identity for protocol
version 1, and ~/.ssh/id_dsa, ~/.ssh/id_ecdsa and ~/.ssh/id_rsa for
protocol version 2. Additionally, any identities represented by the
authentication agent will be used for authentication.
[...]
It is possible to have multiple identity files specified in configu‐
ration files; all these identities will be tried in sequence. Mul‐
tiple IdentityFile directives will add to the list of identities
tried (this behaviour differs from that of other configuration
directives).
基本上,指定IdentityFile
s 只是将密钥添加到 SSH 代理已向客户端呈现的当前列表中。
尝试在文件底部使用此方法覆盖此行为.ssh/config
:
Host *
IdentitiesOnly yes
您还可以在主机级别覆盖此设置,例如:
Host foo
User bar
IdentityFile /path/to/key
IdentitiesOnly yes
答案2
尽管其他人已经通过基于配置的解决方案暗示了这一点,但可能值得指出的是,您可以使用以下命令在命令行上轻松执行一次性操作:
ssh -o 'PubkeyAuthentication no' myhostname.mydomain
答案3
按照 James Sneeringer 的解决方案,您可能只想设置一个 ssh_config ,如下所示:
Host *.mycompany.com
IdentityFile .ssh/id_dsa_mycompany_main
Host *.mycustomer.com
IdentityFile .ssh/id_dsa_mycustomer
Host *
RSAAuthentication no #this should be up top, avoid ssh1 at all costs
PubkeyAuthentication no
如果您使用特定密钥连接到不在公共域中的多台机器,请考虑在您自己的 DNS 中为它们提供所有 CNAME。我对所有客户系统都这样做。
答案4
有一个IdentitiesOnly
选项您可以设置为yes
,在-o IdentitiesOnly=yes
命令行上或IdentitiesOnly yes
在中~/.ssh/config
。
从ssh_config(5)
手册页中:
IdentitiesOnly
Specifies that ssh(1) should only use the configured
authentication identity and certificate files (either the default
files, or those explicitly configured in the ssh_config files or
passed on the ssh(1) command-line)
但是!如果您没有指定任何IdentifyFile
内容(无论是在 中
~/.ssh/config
还是在命令行中使用某些选项) ,则仍将使用-i
默认身份文件!~/.ssh/id_rsa
~/.ssh/id_ed25519
所以如果你真的想使用 ssh仅有的明确指定的键,还需要指定一些无效的IdentifyFile
,例如-i /dev/null
。
例如:
Host *.example.com
IdentityFile ~/.ssh/id_rsa.example.com
Host *.example.org
IdentityFile ~/.ssh/id_rsa.example.org
# Important! The `Host *` block must come **last**, because subsequent `Host`
# blocks cannot override any preceding `Host *` settings. See ssh_config(5):
# “For each parameter, the first obtained value will be used”
Host *
IdentitiesOnly yes
IdentityFile /dev/null