经过几个小时的挖掘,我终于找到了为什么我的计算机不再使用 gnome ssh-askpass 询问我的密钥。这很简单,但我花了很长时间才弄清楚,因为......好吧......大多数遇到类似问题的人都是出于完全不同的原因(即 ssh-agent 没有运行)。
就我而言,我下面有太多键,~/.ssh
所以我所做的就是将它们全部移动,除了id_rsa
在子目录中:~/.ssh/other_keys
。这适用于仅使用命令行选项访问某些计算机的目的,-i
如下所示:
ssh -i ~/.ssh/other_keys/topsecret domain
否则,您必须告诉 SSH 不要测试~/.ssh
目录中找到的所有密钥(因为当发生这种情况时,它会耗尽尝试次数,而尝试次数通常很小,例如 3 或 5 次。)
要解决此问题,您还可以执行以下操作:
ssh -i ~/.ssh/topsecret -o 'IdentitiesOnly yes' domain
这需要大量的输入(是的,您也可以将其添加到您的配置文件中,但如果这只是为了快速测试,那就很烦人了。)
所以...当我想在这里或那里连接一次时,所有这些都非常有用,但是当我想要访问我的主服务器之一时,这很痛苦,因为ssh
现在每次访问时都会要求我输入密码,即使我的ssh-agent
并ssh-askpass
已正确设置。
那么...给出了什么?
不知何故,当您启动时,ssh-add
它会自动将密钥添加到其中,ssh-agent
而无需询问您的密码。然后,一旦您需要使用密钥,它就会自动启动ssh-askpass
(顺便说一句,您的环境中不需要该名称的变量),您可以在其中输入密码并继续。
但是,如果密钥是在子目录中定义的,则不会找到它们,因此不会将它们添加到其中,ssh-agent
并且当您使用ssh
它时,也不会在子目录中找到它们ssh-agent
,因此会直接在控制台中要求您输入密码,并且不在 gnome 弹出窗口中。
将键移回正下方~/.ssh
可以解决问题,但这并不是一个很好的解决方案,因为它会破坏背面ssh -i ...
。 (我知道,可以-o ...
选择告诉 ssh 仅使用一个密钥,从而解决其他问题。但我认为 ssh 应该首先使用命令行指定的密钥进行测试,这将解决我的两个问题。哦,好吧... )
所以...当我运行以下命令时:
ssh-add -D
它ssh-agent
通过以下方式重置密钥:(1) 删除当前存在的所有密钥; (2) 重新安装在下面找到的所有密钥~/.ssh
,而不询问我任何密码(至少在我运行命令时不会ssh-add
)。
有没有办法要求(或任何其他工具)也添加在不同目录(例如我的子目录)ssh-add
中找到的密钥,而无需立即输入所有密码?~/.ssh/other_keys
答案1
这不是一个完整的答案,但如果你查看ssh-agent
它的手册页,会有以下段落。
代理最初没有任何私钥。使用 添加密钥
ssh-add(1)
。当不带参数执行时,ssh-add(1)
添加文件~/.ssh/id_rsa
、~/.ssh/id_dsa
和~/.ssh/id_ecdsa
。~/.ssh/identity
如果身份有密码,则ssh-add(1)
在终端上询问密码(如果有的话),或者从小型 X11 程序(如果在 X11 下运行)询问密码。如果这两种情况都不是,则身份验证将失败。然后它将身份发送给代理。代理中可以存储多个身份;代理可以自动使用这些身份中的任何一个。ssh-add -l
显示代理当前持有的身份。
因此,您可以看到当前加载的键ssh-agent
,并且它将默认加载该段落中描述的键。
答案2
也许这个AddKeysToAgent
选项(在最新的 OpenSSH 版本中可用)在这种情况下有用?
指定是否应将密钥自动添加到正在运行的 ssh-agent(1)。如果此选项设置为 yes 并且从文件加载密钥,则密钥及其密码短语将以默认生命周期添加到代理中,就像通过 ssh-add(1) 一样。如果此选项设置为询问,则 ssh(1) 将需要在添加密钥之前使用 SSH_ASKPASS 程序进行确认(有关详细信息,请参阅 ssh-add(1))。如果此选项设置为确认,则每次使用该密钥都必须确认,就像为 ssh-add(1) 指定了 -c 选项一样。如果此选项设置为 no,则不会将任何密钥添加到代理。参数必须为 yes、confirm、ask 或 no(默认值)。