我通过以下方式向代理添加了 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 密钥但我认为这就是你要找的。