ssh-add 在重新启动之间不会持续存在

ssh-add 在重新启动之间不会持续存在

我通过以下方式向代理添加了 ssh 密钥:

$ ssh-add ~/.ssh/id_rsa_mac
Identity added: /Users/alex/.ssh/id_rsa_mac (/Users/alex/.ssh/id_rsa_mac)

重新启动后,代理不再添加此密钥:

$ ssh-add -l
The agent has no identities.

为什么会发生这种情况?

答案1

向代理添加密钥是暂时的。它们仅在代理运行时持续。如果您终止它或重新启动计算机,它们就会丢失,直到您再次重新添加它们为止。从ssh-agent手册页:

ssh-agent 是一个保存用于公钥身份验证(RSA、DSA、ECDSA)的私钥的程序。这个想法是 ssh-agent 在 X 会话或登录会话开始时启动,所有其他窗口或程序都作为 ssh-agent 程序的客户端启动。通过使用环境变量,可以在使用 ssh(1) 登录其他计算机时找到代理并自动用于身份验证。

代理最初没有任何私钥。使用 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显示代理当前持有的身份。

macOS 塞拉利昂

从 macOS Sierra 10.12.2 开始,Apple 为 SSH 配置添加了 UseKeychain 配置选项。您可以通过添加UseKeychain yes到您的~/.ssh/config.

Host *
  UseKeychain yes

OSX 钥匙扣

我不使用 OSX,但确实在 SuperUser 上找到了这个问答,标题为:如何将 Mac OS X 钥匙串与 SSH 密钥一起使用?

据我了解,自 Mac OS X Leopard 起,钥匙串就支持存储 SSH 密钥。有人可以解释一下这个功能应该如何工作吗?

因此,从声音来看,您可以使用以下命令将 SSH 密钥导入到 Keychain 中:

$ ssh-add -K [path/to/private SSH key]

然后,您的密钥应该在每次启动时都保持不变。

每当您重新启动 Mac 时,钥匙串中的所有 SSH 密钥都会自动加载。您应该能够在“钥匙串访问”应用程序中以及通过以下命令行查看密钥:

  ssh-add -l

来源:超级用户 - 如何将 Mac OS X 钥匙串与 SSH 密钥一起使用?

塞拉之上?

在更高版本的 MacOS 中,您在尝试使用-K-A开关时可能会遇到此消息。例如:

 $ ssh-add -K
WARNING: The -K and -A flags are deprecated and have been replaced
         by the --apple-use-keychain and --apple-load-keychain
         flags, respectively.  To suppress this warning, set the
         environment variable APPLE_SSH_ADD_BEHAVIOR as described in
         the ssh-add(1) manual page.

因此,请改用警告消息提供的指导:

$ ssh-add --apple-load-keychain --apple-load-keychain
Identity added: /Users/slm/.ssh/somekey1_id_rsa (/Users/slm/.ssh/somekey1_id_rsa)
Identity added: /Users/slm/.ssh/somekey2_id_rsa (/Users/slm/.ssh/somekey2_id_rsa)

您还可以使用此环境变量及其APPLE_SSH_ADD_BEHAVIOR值来抑制该警告macos。从ssh-add手册页:

$ man ssh-add
...
APPLE_SSH_ADD_BEHAVIOR
        Enables or disables the older processing of the -A and -K 
        options used in earlier macOS releases.  These options have 
        been renamed --apple-load-keychain and --apple-use-keychain
        respectively. However, -A and -K still behave as in earlier 
        releases except in the following circumstances.  If a 
        security provider was specified with -S or SSH_SK_PROVIDER, 
        or if APPLE_SSH_ADD_BEHAVIOR is set to the value “openssh”, 
        then ssh-add uses standard OpenSSH behavior: the -A flag is 
        not recognized and the -K flag behaves as documented in the 
        DESCRIPTION section above.

        Otherwise, ssh-add -A and -K will behave as in earlier macOS 
        releases. A warning will be output to standard error unless
        APPLE_SSH_ADD_BEHAVIOR is set to the value “macos”.  Note: 
        Future releases of macOS will not support neither -A nor -K
        without setting this environment variable.

答案2

ssh-agent是一个临时存储密钥的会话服务对于用户来说。

SSH 代理的主要目的是记住使用密码保护的密钥的明文版本。换句话说,密钥存储在使用密码加密的磁盘上,并且密钥的所有者使用ssh-add或某些 GUI 工具来提供密码并指示代理记住它,直到会话退出或用户明确请求删除为止。

如果您没有使用密码并且没有使用代理转发(无论如何,这对于大多数用途来说都是不安全的),你根本不需要代理。任何 SSH 客户端都应该能够从磁盘读取密钥,无论是从标准位置还是从明确指定的位置。

手册页中列出了标准位置ssh(1)

协议版本 1 的默认值为 ~/.ssh/identity,协议版本 2 的默认值为 ~/.ssh/id_dsa、~/.ssh/id_ecdsa、~/.ssh/id_ed25519 和 ~/.ssh/id_rsa。

使用非标准位置时,您可以使用同一手册页中描述的-i开关ssh,或您正在使用的 SSH 客户端中的相应选项。

答案3

塞拉:

使用使用钥匙扣。 (我没有尝试过,但这听起来是最正确的解决方案。)

或者

ssh-add -K /your/key
echo ssh-add -A | cat >> ~/.bash_profile

或者创建一个plist文件而不是附加到~/.bash_profile.

免责声明:正如其他人所指出的,我不知道在钥匙串中存储 ssh 密码有多安全。

答案4

请注意,上面的答案几乎都没有解决这个问题。我有下面列出的 Linux 和 MacOs 解决方案。

在 Linux 上,也会出现同样的问题。正如其他人所说,这是因为ssh-add这只是暂时的。解决方案是添加ssh-add命令.bashrc或干脆不使用它。

解决方案如下所述这个答案如何告诉 git 使用哪个私钥?

选项 4:~/.ssh/config

使用~/.ssh/config其他答案中建议的文件来指定您的私钥的位置,例如

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

在 Mac 上,以下行添加到配置中~/.ssh/config对我有用

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/github

我没有测试这个答案macOS Sierra 似乎不记得重启之间的 SSH 密钥但我认为这就是你要找的。

相关内容