macOS Sierra似乎不记得重新启动之间的SSH密钥


184

自升级到macOS以来,我必须运行以下命令:

ssh-add -K

重新启动后可以解决此问题,但是每次登录计算机时都必须运行此命令。

如果我没有运行上面的命令,那么我的输入将~/.ssh被跳过,并要求我输入服务器密码以建立连接。


1
$ ssh-add -K给我ssh-add: illegal option -- K
modius '16

1
您需要在之后输入私钥路径-K。请参阅@JakeGould的答案以获取解决方案。
bisherbas '16

10.12.2更新为我消除了一些不必要的服务器密码请求。现在,您可能不再需要运行ssh-add -K。
Wayfaring Stranger

Answers:


215

从macOS Sierra 10.12.2开始,Apple添加了一个ssh_config名为的选项UseKeychain,该选项允许“正确”解决该问题。将以下内容添加到您的~/.ssh/config文件中:

Host *
   AddKeysToAgent yes
   UseKeychain yes     

ssh_config man10.12.2 的页面上:

UseKeychain

在macOS上,指定在尝试使用特定密钥时系统是否应在用户的密钥链中搜索密码短语。当用户提供密码短语时,此选项还指定一旦被验证正确,是否应将密码短语存储在钥匙串中。参数必须为“是”或“否”。默认为“否”。


2
根据此链接:openradar.appspot.com/27348363苹果公司“已将其行为与该领域的主流OpenSSH进行了调整”。
ThomasW '16

15
荒谬的是,Apple以某种方式修改了行为,这将对绝大多数开发人员造成问题(因为GitHub推动,如果没有其他事情的话),并且对任何人都什么都没说!
mluisbrown '16

9
我认为这IdentityFile ~/.ssh/id_rsa是多余的,不需要(在查看默认选项时)。我从未在ssh配置文件中设置该选项。
therealmarv

9
@JakeGould ~/.ssh/config~最好进行IMO更改,因为它可以从根本上解决问题ssh。不能100%地确定该.bash_profilemod是否可以在不使用Shell的情况下使用ssh用于GUI客户端。
mluisbrown '16

7
苹果公司发布了有关此更改的技术说明TN2449
肯索(Kentzo)

106

当尝试使用Capistrano部署一些代码时,我也遇到了这个问题。非常沮丧。我知道有两种方法可以解决此问题。

方法1:将所有已知密钥添加到SSH代理。

因此,我发现一种解决方案是ssh-add使用该-A选项运行-使用存储在钥匙串中的任何密码将所有已知身份添加到SSH代理中,如下所示:

ssh-add -A

现在可以使用,但不会在重启后持续存在。因此,如果您不想再为此担心,只需打开用户的~/.bash_profile文件,如下所示:

nano ~/.bash_profile

并将此行添加到底部:

ssh-add -A 2>/dev/null;

现在,当您打开一个新的终端窗口时,一切都会很好!

方法2:仅将钥匙串中的SSH密钥添加到代理。

因此,尽管该ssh-add -A选项适用于大多数基本情况,但最近我遇到了一个问题,即在较常见的机器上安装了6-7个Vagrant框(使用SSH密钥/身份进行访问)id_rsa.pub

长话短说,由于服务器访问基于密码,并且SSH密钥/身份是SSH密钥/身份,因此由于基于SSH密钥/身份的尝试失败太多,我最终被锁定在远程服务器之外。因此SSH代理尝试了我所有的SSH密钥,但均失败了,甚至无法进入密码提示符。

问题是,ssh-add -A即使没有必要,它只会将您拥有的每个SSH密钥/身份随意添加到代理中。例如“无业游民”的盒子

经过大量测试后,我的解决方案如下。

首先,如果您向代理添加的SSH密钥/身份超出了您的需要,如图所示,ssh-add -l则将其从代理中清除,如下所示:

ssh-add -D

完成后,将SSH代理作为后台进程启动,如下所示:

eval "$(ssh-agent -s)"

现在,它变得很奇怪,我不太确定为什么。在某些情况下,您可以~/.ssh/id_rsa像这样将密钥/身份专门添加到代理中:

ssh-add ~/.ssh/id_rsa

输入您的密码短语,点击后就Return可以了。

但是在其他情况下,只需运行此命令就足以添加密钥/身份:

ssh-add -K

如果一切正常,请键入,ssh-add -l然后应该会列出一个单独的SSH密钥/身份。

都好?现在打开您的.bash_profile

nano ~/.bash_profile

并将此行添加到底部;注释或删除该-A版本(如果已安装):

ssh-add -K 2>/dev/null;

这将允许在每次启动/重新引导时将SSH密钥/身份重新加载到SSH代理。

更新:Apple现在已UseKeychain在打开的SSH配置选项中添加了一个选项,并考虑ssh-add -A了一种解决方案。

从macOS Sierra 10.12.2开始,Apple已UseKeychain为SSH配置添加了配置选项。检查手册页(通过man ssh_config)显示以下信息:

UseKeychain
        On macOS, specifies whether the system should search for
        passphrases in the user's keychain when attempting to use a par-
        ticular key. When the passphrase is provided by the user, this
        option also specifies whether the passphrase should be stored
        into the keychain once it has been verified to be correct.  The
        argument must be ``yes'' or ``no''.  The default is ``no''.

归结为Apple认为该解决方案是按照Open Radar票证中的说明添加ssh-add -A到您的解决方案中,或作为每个用户的选项之一添加。.bash_profile UseKeychain~/.ssh/config


4
@modius:如果您具有密码保护密钥,请执行ssh-add -K [path to key]并在提示时输入密码。钥匙串将存储密码,然后ssh-add将从那里获取密码。
Timo

2
请注意,-A用于使用存储在钥匙串中的任何通行密码为代理添加身份。如果您还有没有密码的身份,则需要省略-A选项以将其添加到代理中。
埃文·庞

12
只是为了增加对此的可见性,Apple更新了ssh_config的手册页,使其包含UseKeychainAddKeysToAgent自动从ssh_config中添加密钥。无需外壳脚本。有关10.12.2的更新信息,请参见下面的@mluisbrown答案
Ryan Gibbons

1
@JakeGo我能明白您的意思吗,我真的喜欢他们在做什么。它们可以自动控制安全性,而不是将密码自动保存到钥匙串并在引导时加载它。/耸肩
瑞安·吉本斯

1
@RyanGibbons FWIW,在OpenRadar上的答案中查看Apple Developer Relations的官方建议:ssh-add -A如果希望始终加载密钥,则可以通过在rc脚本中运行很容易地解决此问题。” ¯\_(ツ)_/¯
JakeGould

16

正如解释在这里,这是因为推荐的方法MACOS 10.12.2

  1. 将以下行添加到您的~/.ssh/config文件:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
  2. 使用该命令添加到ssh-agent的任何密钥ssh-add /path/to/your/private/key/id_rsa都将自动添加到钥匙串中,并应在重新引导后自动加载。


我添加此答案的原因是:

  • 其他答案告诉您添加IdentityFile ~/.ssh/id_rsa行,但是自动加载键不需要该选项(它实际上会将特定的键绑定到添加它的主机部分,如果您使用不同的键,则不需要不同的热点)。
  • 接受的答案提到UseKeychain,但这不足以在ssh-agent重新启动后保留密钥。

1
关于第二点。你到底有多确定?重新启动后实际上什么也没有发生,参考资料中也没有提及。上面的配置所做的是,您的SSH客户端将在第一次连接时将密钥加载到代理中(并且还将从钥匙串中获取密码),然后密钥将保持加载状态。您可以通过重启后立即列出密钥来验证此声明,ssh-add -L它将报告The agent has no identities。除非您连接,否则什么都不会在那里。在AddKeysToAgent不重新启动持续按键之间以任何方式!
Danila Vershinin

15

我写了一篇有关该主题的简短文章,可能会对您有所帮助。

一种解决方案是ssh-add -A在每次启动时都调用命令。

只需将.plist具有以下内容的文件添加到路径~/Library/LaunchAgents/或使用Lingon应用程序创建一个文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ssh-add-a</string>
    <key>ProgramArguments</key>
    <array>
        <string>ssh-add</string>
        <string>-A</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

<!-- @@@@LingonWhatStart:ssh-add -A@@@@LingonWhatEnd -->

8

从macOS 10.12.2开始,您可以使用该UseKeychain选项。 在这里阅读更多或研究man ssh_config

     UseKeychain
         On macOS, specifies whether the system should search for passphrases in the user's keychain
         when attempting to use a particular key. When the passphrase is provided by the user, this
         option also specifies whether the passphrase should be stored into the keychain once it has
         been verified to be correct.  The argument must be ``yes'' or ``no''.  The default is ``no''.

因此,请执行以下操作:

echo "UseKeychain yes" >> ~/.ssh/config


1
>>如果您多次输入该命令,则使用存在风险。如mluisbrown答案ChrisJF答案所述,最好对文件进行手动编辑。
心教堂

你是在那里:-)

4

我发现这ssh-add -K给了我“ 非法选择-K ”。这是因为ssh-add是来自/ usr / local / bin的奇怪版本(由brew安装?)。我可以通过使用/ usr / bin中的ssh-add来添加密钥:

/usr/bin/ssh-add -K ~/.ssh/id_rsa

这是我多年来无法轻松工作之后对我有效的方法。
nyxee

4

我之前遇到过这个问题,并且找到了一种绕过此问题的方法。我刚刚在文件夹中创建了一个名为config~/.ssh文件,在其中添加了以下几行:

Host github.com
HostName github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes

我不知道为什么,但HostHostName两者都很重要。在我的情况下,如果其中一个不存在,则解决方案将无法正常工作。

然后,我只是做了一个ssh-add -K,即使重新启动后它仍在工作。


1
主机是用户为特定服务器定义的名称/别名,并为每台服务器划分条目:从风格上看,最好缩进主机条目后的行。HostName表示服务器的网络可寻址名称,例如github.com,但您也可以使用IP地址。Host和HostName不必相同,但是是的,它们都是ssh配置格式的组成部分。
马克·福克斯

4

如果您使用的是其他版本的ssh(例如,通过自制软件安装),则上述解决方案将无法立即使用。例如,非Apple ssh版本无法识别AddKeysToAgent yesUseKeychain yes中的.ssh/config文件,并且会导致错误。客户端的-A-K选项相同ssh

这意味着@mluisbrown的答案根本不起作用。您可以使用@JakeGould答案的方法1,并在其中明确使用macOS ssh-add实用程序.bash_profile将所有密钥添加到钥匙串,即:

/usr/bin/ssh-add -A

以上评论所述,您可能必须先向钥匙串添加钥匙:例如/usr/bin/ssh-add -K .ssh/github


2

修改〜/ .ssh / config为所有主机添加UseKeyChain足以阻止这种重复的噩梦;)

Host *
 UseKeychain yes

如果文件为空或不存在,则简单创建和/或添加上述配置。


1

我更新到了Mac OS X Sierra(10.12.6)。我可以使用其他主机,但不能使用github.com。

这是我必须插入〜/ .ssh / config中的内容:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

更改之后,我可以像以前一样使用github。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.