如何使用Ubuntu上的ssh插件永久添加私钥?

How to permanently add a private key with ssh-add on Ubuntu?

我有一个私钥,有密码保护,可以通过ssh访问服务器。

我有2台Linux(Ubuntu10.04)机器,ssh add命令的行为在这两台机器中都是不同的。

在一台机器中,一旦我使用了"ssh add.ssh/identity"并输入了我的密码,这个密钥就被永久添加,即每次我关闭计算机并再次登录时,这个密钥就已经添加了。

在另一个系统中,每次登录时都必须添加密钥。

据我所知,我在这两个方面都做了同样的事情。唯一的区别是,密钥是在永久添加的密钥上创建的。

有人知道如何将它永久地添加到另一台机器上吗?


解决方案是通过将密钥文件添加到您的~/.ssh/config文件中来强制永久保存:

1
2
IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

如果在~/.ssh目录中没有"config"文件,那么应该创建一个。它不需要根权限,所以简单地说:

1
nano ~/.ssh/config

…并根据您的要求输入上述行。

为此,文件需要有chmod 600。您可以使用命令chmod 600 ~/.ssh/config

如果您希望计算机上的所有用户使用密钥,请将这些行放入/etc/ssh/ssh_config中,并将密钥放入所有用户都可以访问的文件夹中。

此外,如果要将密钥设置为特定于一个主机,可以在~/.ssh/config中执行以下操作:

1
2
3
4
Host github
    HostName github.com
    User git
    IdentityFile ~/.ssh/githubKey

您将需要使用@github而不是@github.com进行克隆,但这样做的好处是只尝试使用此密钥。


在Mac OS X Lion下,这并不能回答我同样的问题。我最后补充道:

1
ssh-add ~/.ssh/id_rsa &>/dev/null

对于我的.zshrc(但是.profile也可以),它似乎已经修复了它。

(此处建议:http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/)


我在mac osx(10.10)上通过使用ssh-add的-k选项解决了这个问题:

1
ssh-add -K ~/.ssh/your_private_key

对于MacOS 10.12及更高版本,您需要另外编辑ssh配置,如下所述:https://github.com/jirsbek/ssh-keys-in-macos-塞拉-keychain


只需添加钥匙链,如Ubuntu快速提示中所述。https://help.ubuntu.com/community/quicktips网站

什么

不必经常启动ssh agent和ssh add,而是可以使用keychain来管理您的ssh密钥。要安装keychain,您只需单击此处,或者使用synaptic执行该任务,或者从命令行中获取apt。

命令行

安装文件的另一种方法是打开终端(应用程序->附件->终端)并键入:

1
sudo apt-get install keychain

编辑文件

然后,您应该将以下行添加到您的$home/.bashrc或/etc/bash.bashrc中:

1
2
keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh


我尝试了@aron的解决方案,但它不太适合我,因为每次我在终端中打开一个新标签时,它都会重新添加我的密钥。所以我对它做了一点修改(请注意,我的大多数密钥也是受密码保护的,所以我不能只将输出发送到/dev/null):

1
2
3
4
5
added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add"$HOME/.ssh/my_key"
fi

它的作用是检查ssh-add -l的输出(列出所有已添加的键),以查找特定的键,如果找不到,则将其与ssh-add一起添加。

现在,我第一次打开终端时,我被要求输入我的私人密钥的密码,在我重新启动(或注销-我没有检查)我的计算机之前,我不会再被要求输入密码。

因为我有很多键,所以我将ssh-add -l的输出存储在一个变量中以提高性能(至少我猜它可以提高性能:)

PS:我在Linux上,这段代码被放到了我的~/.bashrc文件中——如果你在Mac OS X上,那么我假设你应该把它添加到.zshrc.profile中。

编辑:正如@aron在评论中指出的那样,.zshrc文件是从zshshell中使用的,因此如果您不使用该文件(如果您不确定,那么很可能是使用bash文件),则此代码应该转到您的.bashrc文件中。


在我的案例中,解决方案是:

Permissions on the config file should be 600. chmod 600 config

如上述评论所述一般意见

无需触摸配置文件内容。


我在Ubuntu16.04上也遇到了同样的问题:一些密钥是永久添加的,而另一些密钥我必须在每个会话上执行ssh-add。我发现,永久添加的密钥在~/.ssh中既有私钥,也有公钥;在每个会话中被遗忘的密钥在~/.ssh目录中只有私钥。所以解决方案很简单:在执行ssh-add之前,应该将私有和公共密钥复制到~/.ssh


在Ubuntu 14.04(可能更早,也可能更早)上,您甚至不需要控制台:

  • 启动seahorse或启动你找到的搜索"钥匙"的东西。
  • 在那里创建一个ssh密钥(或导入一个)。
    • 无需将密码留空
    • 它甚至可以将公钥推送到服务器(或更多服务器)上。
  • 最后,您将运行一个ssh代理,并加载该密钥,但该密钥被锁定。
  • 使用ssh将通过代理获取身份(即密钥)。
  • 在会话期间首次使用时,将检查密码短语
    • 您可以选择在登录时自动解锁密钥
    • 这意味着登录验证将用于包装密钥的密码短语。
  • 注意:如果您想转发您的身份(即代理转发),请使用-A调用您的ssh,或将其设为默认值。
    • 否则,您无法在稍后登录到第三台计算机的计算机上使用该密钥进行身份验证

这对我有用。

1
2
ssh-agent /bin/sh
ssh-add /path/to/your/key

我使用两个ID_rsa密钥(一个用于工作的个人密钥)运行Ubuntu。ssh-add会记住一个密钥(个人密钥),每次都会忘记一个公司密钥。

看看这两者的区别,我发现我的个人钥匙有400个权限,而公司一号有600个权限。(有U+W)。从公司密钥(U-W或设置为400)中删除用户写权限,解决了我的问题。ssh-add现在记住这两个键。


非常简单的两步

1.yum安装钥匙链

2.在.bash_配置文件中添加以下代码

1
2
/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh


在"~/.bashrc"中添加以下行为我解决了这个问题。我正在使用Ubuntu 14.04桌面。

1
2
3
4
eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"

对于那些使用fish shell的用户,可以使用以下函数,然后在~/.config/fish/config.fish中调用它。它将把以id_rsa开头的所有密钥加载到ssh-agent中。

1
2
3
4
5
6
7
8
9
10
11
12
# Load all ssh keys that start with"id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name"*.pub" -a -iname"id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add"$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

如果您希望在打开终端时自动启动ssh-agent,可以使用tuvistavie/fish ssh代理来执行此操作。