hotoku Asked: 2024-09-13 09:09:37 +0800 CST2024-09-13 09:09:37 +0800 CST 2024-09-13 09:09:37 +0800 CST ssh 会记住私钥吗? 772 我认为-issh 的选项是指定密钥文件。 我发现我可以通过任何文件通过 github.com 进行身份验证,即使是空文件,如下面的屏幕截图所示。 但重启后,我无法再进行身份验证。 观察这一点,我认为 ssh 命令会记住曾经使用过的密钥,并在使用选项给出的密钥失败时自动使用它-i。 对吗?我认为这是非常不自然的行为,我肯定我误解了什么。 ssh 2 个回答 Voted Best Answer Kamil Maciorowski 2024-09-13T13:18:08+08:002024-09-13T13:18:08+08:00 是否ssh记得私钥? 答案取决于ssh您使用的实现和配置。这里我将展示一种涉及sshOpenSSH 的可能设置;对于此特定设置,简化的答案是肯定的。 可能的设置 首先:它-i /the/key本身并不能阻止ssh使用其他密钥。它可以防止ssh回退到默认密钥(~/.ssh/id_rsa、~/.ssh/id_ecdsa、~/.ssh/id_ecdsa_sk、~/.ssh/id_ed25519、~/.ssh/id_ed25519_sk),但如果您的配置(~/.ssh/config和/etc/ssh/ssh_config)指定了其他密钥(IdentityFile指令),那么就像您使用了多个-i选项一样:将逐个尝试多个密钥,直到接受一个密钥或列表耗尽。 就您而言,如果正确的密钥来自配置,则在重启后也会使用。但这并没有发生,所以肯定有其他原因。 密钥的另一个来源(即使您使用-i)可能是代理。请阅读我的另一个答案ssh-agent中的“理解” 。它不必完全是,还有其他程序可以代替它的角色。无论如何,可能有一个代理正在运行。ssh-agent 假设有一个代理正在运行。当您使用ssh -i密钥(例如,在您的情况下使用正确的密钥)时,ssh可能会或可能不会将密钥添加到代理。这由以下AddKeysToAgent选项控制: 指定是否应将密钥自动添加到正在运行的ssh-agent(1)。如果将此选项设置为yes,并且密钥是从文件加载的,则密钥及其密码将以默认生存期添加到代理,就像 一样ssh-add(1)。 的默认值AddKeysToAgent是no,但是如果管理员输入AddKeysToAgent yes了/etc/ssh/ssh_config(或者如果该值来自发行版)或者您将该行输入了您的~/.ssh/config(并且可能忘记了),那么该值可能是yes您的ssh。 假设值为yes,因此正确的密钥已添加到代理中。如果您ssh再次使用,这次使用-i /wrong/key,则代理中的密钥可能会或可能不会被使用。这由以下IdentitiesOnly选项控制: 指定ssh(1)应仅使用已配置的身份验证身份和证书文件(默认文件,或在文件中明确配置的ssh_config或在命令行上传递的文件ssh(1)),即使ssh-agent(1)或提供更多身份。PKCS11ProviderSecurityKeyProvider 如果是此选项no(默认),则将使用代理中存储的密钥。(请注意,还有其他可能的提供商,但我不会详细说明)。 所有这些意味着,如果代理正在运行,并且如果AddKeysToAgent是yes(或类似情况),并且如果IdentitiesOnly是no,那么您观察到的就是预期的行为。在这种情况下,对您问题的简化答案是肯定的。非简化的严格答案是:不,ssh 它本身不记得私钥(但ssh-agent记得)。 如何确认 要查看是否存在代理,请运行: env | grep -E '^SSH_AUTH_SOCK|^SSH_AGENT_PID' 如果SSH_AUTH_SOCK环境中存在,则很可能有代理正在运行。您的桌面环境可能会在您每次登录时为您运行代理,而您在此之前并不知道。如果SSH_AGENT_PID环境中存在,则您可以使用例如进一步调查ps -u -p "$SSH_AGENT_PID"。 ssh您可以通过运行以下命令查看(来自 OpenSSH)的相关配置ssh -G: ssh -G -i /tmp/hoge [email protected] | grep -iE 'identityfile|addkeystoagent|identitiesonly' 请注意,输出可能包含不同的IdentityFile行,具体取决于是否/tmp/hoge存在。当您观察到“问题”时,该文件存在,因此请确保您使用时它现在存在ssh -G。 ssh -G不会显示哪些密钥已添加到代理。要查看它们,请查询代理: ssh-add -l 重新启动并复制“问题”,ssh-add -l在每次之前和之后调用ssh。这样你就会知道这个答案是否解释了你的特定情况下发生的事情。 即使这不是(或不完全是)您所处的具体情况,这种情况仍然是有可能的,并且答案可能对其他人有用。 grawity_u1686 2024-09-13T13:33:31+08:002024-09-13T13:33:31+08:00 您的屏幕截图看起来像是 macOS,我记得它有一个自定义的 OpenSSH 补丁,可以自动将私钥添加到其 ssh-agent(钥匙串?)。用于ssh-add -l列出它们并ssh-add -D清除它们。 (这早于 OpenSSH 后来获得的标准 AddKeysToAgent 选项,所以我不知道它是否可配置。) 该-i选项不与代理使用相排斥;将首先尝试指定的密钥,但其他可用密钥(包括来自 ssh-agent 的密钥)仍保留在列表中。用于-oIdentitiesOnly=true更改该行为。
答案取决于
ssh
您使用的实现和配置。这里我将展示一种涉及ssh
OpenSSH 的可能设置;对于此特定设置,简化的答案是肯定的。可能的设置
首先:它
-i /the/key
本身并不能阻止ssh
使用其他密钥。它可以防止ssh
回退到默认密钥(~/.ssh/id_rsa
、~/.ssh/id_ecdsa
、~/.ssh/id_ecdsa_sk
、~/.ssh/id_ed25519
、~/.ssh/id_ed25519_sk
),但如果您的配置(~/.ssh/config
和/etc/ssh/ssh_config
)指定了其他密钥(IdentityFile
指令),那么就像您使用了多个-i
选项一样:将逐个尝试多个密钥,直到接受一个密钥或列表耗尽。就您而言,如果正确的密钥来自配置,则在重启后也会使用。但这并没有发生,所以肯定有其他原因。
密钥的另一个来源(即使您使用
-i
)可能是代理。请阅读我的另一个答案ssh-agent
中的“理解” 。它不必完全是,还有其他程序可以代替它的角色。无论如何,可能有一个代理正在运行。ssh-agent
假设有一个代理正在运行。当您使用
ssh -i
密钥(例如,在您的情况下使用正确的密钥)时,ssh
可能会或可能不会将密钥添加到代理。这由以下AddKeysToAgent
选项控制:的默认值
AddKeysToAgent
是no
,但是如果管理员输入AddKeysToAgent yes
了/etc/ssh/ssh_config
(或者如果该值来自发行版)或者您将该行输入了您的~/.ssh/config
(并且可能忘记了),那么该值可能是yes
您的ssh
。假设值为
yes
,因此正确的密钥已添加到代理中。如果您ssh
再次使用,这次使用-i /wrong/key
,则代理中的密钥可能会或可能不会被使用。这由以下IdentitiesOnly
选项控制:如果是此选项
no
(默认),则将使用代理中存储的密钥。(请注意,还有其他可能的提供商,但我不会详细说明)。所有这些意味着,如果代理正在运行,并且如果
AddKeysToAgent
是yes
(或类似情况),并且如果IdentitiesOnly
是no
,那么您观察到的就是预期的行为。在这种情况下,对您问题的简化答案是肯定的。非简化的严格答案是:不,ssh
它本身不记得私钥(但ssh-agent
记得)。如何确认
要查看是否存在代理,请运行:
如果
SSH_AUTH_SOCK
环境中存在,则很可能有代理正在运行。您的桌面环境可能会在您每次登录时为您运行代理,而您在此之前并不知道。如果SSH_AGENT_PID
环境中存在,则您可以使用例如进一步调查ps -u -p "$SSH_AGENT_PID"
。ssh
您可以通过运行以下命令查看(来自 OpenSSH)的相关配置ssh -G
:请注意,输出可能包含不同的
IdentityFile
行,具体取决于是否/tmp/hoge
存在。当您观察到“问题”时,该文件存在,因此请确保您使用时它现在存在ssh -G
。ssh -G
不会显示哪些密钥已添加到代理。要查看它们,请查询代理:重新启动并复制“问题”,
ssh-add -l
在每次之前和之后调用ssh
。这样你就会知道这个答案是否解释了你的特定情况下发生的事情。即使这不是(或不完全是)您所处的具体情况,这种情况仍然是有可能的,并且答案可能对其他人有用。
您的屏幕截图看起来像是 macOS,我记得它有一个自定义的 OpenSSH 补丁,可以自动将私钥添加到其 ssh-agent(钥匙串?)。用于
ssh-add -l
列出它们并ssh-add -D
清除它们。(这早于 OpenSSH 后来获得的标准 AddKeysToAgent 选项,所以我不知道它是否可配置。)
该
-i
选项不与代理使用相排斥;将首先尝试指定的密钥,但其他可用密钥(包括来自 ssh-agent 的密钥)仍保留在列表中。用于-oIdentitiesOnly=true
更改该行为。