ssh-add 在重启之间不是持久的

アレッ*_*ックス 181 osx ssh ssh-agent

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

$ ssh-add ~/.ssh/id_rsa_mac
Identity added: /Users/alex/.ssh/id_rsa_mac (/Users/alex/.ssh/id_rsa_mac)
Run Code Online (Sandbox Code Playgroud)

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

$ ssh-add -l
The agent has no identities.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

slm*_*slm 200

向代理添加密钥是暂时的。它们仅在代理运行期间持续。如果您杀死它或重新启动计算机,它们就会丢失,直到您再次重新添加它们。从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
Run Code Online (Sandbox Code Playgroud)

OSX 钥匙串

我不使用 OSX,但在 SuperUser 上找到了题为:How to use Mac OS X Keychain with SSH keys?.

我知道自从 Mac OS X Leopard 以来,Keychain 已经支持存储 SSH 密钥。有人可以解释一下这个功能应该如何工作。

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

$ ssh-add -K [path/to/private SSH key]
Run Code Online (Sandbox Code Playgroud)

然后,您的密钥应该从启动到启动一直存在。

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

  ssh-add -l
Run Code Online (Sandbox Code Playgroud)

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

  • 小旁注,如果您的 ssh-add 命令无法识别 -K 标志,您可能正在使用 ssh-add 的 macports 版本……您可以通过指定 ssh-add 的 OSX 版本的完整路径来绕过 macports 版本像这样:`/usr/bin/ssh-add -K /path/to/private/key` (5认同)
  • @Alex 正如答案所解释的那样,代理会自动添加`~/.ssh/id_rsa`。我猜这是您的密钥文件在 linux 上的位置。您也可能没有使用标准的 ssh 密钥代理。还有其他一些,例如 gnome-keyring-daemon,它们可能有不同的行为。 (2认同)

Pav*_*rda 23

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 客户端中的相应选项。

  • +1 提倡不使用`ssh-agent` (4认同)

Dav*_*cki 14

塞拉利昂

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

或者

ssh-add -K /your/key
echo ssh-add -A | cat >> ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

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

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


小智 8

我这样做是为了帮助我在 Mac 重新启动后启用 SSH 身份。适用于更新的 macOS 10、11 和 12。

  1. 确保您的 SSH 密钥在创建时有一个密码,因为钥匙串需要它。如果您没有密码,您仍然可以通过运行以下命令修改您的no-passphrase-privatekey以拥有密码:

    ssh-keygen -p -f ~/.ssh/<.your-privatekey-filename.>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过运行以下命令将您的 ssh 私钥添加到钥匙串:

    ssh-add --apple-use-keychain ~/.ssh/<.your-privatekey-filename.>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 通过运行以下命令将钥匙串中所有与 SSH 相关的私钥添加到 ssh-agent 中:ssh-add --apple-load-keychain

  4. 通过运行验证ssh-add -l。如果一切正常,您应该会看到结果列表。

您会注意到,重新启动计算机后,您丢失了 SSH 身份(ssh-add-l显示未找到身份...)。您可以通过以下两种方式之一修复它:

  1. 添加ssh-add --apple-load-keychain到您的终端配置文件;例如,如果您使用 zsh,请添加ssh-add --apple-load-keychain~/.zshrc您的任何配置文件。

  2. 您可以通过在~/Library/LaunchAgents/com.<.yourusename.>.<.name of command.>.plist. 例如,com.myusername.ssh.plist,包含:

    ssh-keygen -p -f ~/.ssh/<.your-privatekey-filename.>
    
    Run Code Online (Sandbox Code Playgroud)

    告诉launchd每次重新启动时加载此脚本:

    launchctl load ~/Library/LaunchAgents/com.myusername.ssh.plist
    
    Run Code Online (Sandbox Code Playgroud)

    (如果您不知道您的用户名,请运行命令id来查看您当前的用户名。)

  • @DanielKatz 这些说明已经过时了。“-A”选项已重命名为“--apple-load-keychain”。“-K”被重命名为“--apple-use-keychain”。请参阅“man ssh-add” (2认同)

小智 5

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

\n

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

\n

解决方案如How to Tell git which private key to use? 的答案所述。

\n
\n

选项 4:~/.ssh/config

\n

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

\n
Host github.com\n  User git\n  Hostname github.com\n  IdentityFile ~/.ssh/id_rsa\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
Host *\n  AddKeysToAgent yes\n  UseKeychain yes\n  IdentityFile ~/.ssh/github\n
Run Code Online (Sandbox Code Playgroud)\n

我没有测试这个答案macOS Sierra does not \ xe2 \ x80 \ x99t似乎在重新启动之间记住SSH密钥,但我认为这就是你正在寻找的。

\n