572

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

我有 2 台 linux (ubuntu 10.04) 机器,并且 ssh-add 命令的行为在它们中都不同。

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

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

据我记得,我对两者都做了同样的事情。唯一的区别是密钥是在永久添加的密钥上创建的。

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

4

13 回答 13

808

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

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

如果您在 ~/.ssh 目录中没有“配置”文件,那么您应该创建一个。它不需要root权限,所以很简单:

nano ~/.ssh/config

...并根据您的要求输入上面的行。

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

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

此外,如果您想设置特定于一台主机的密钥,您可以在 ~/.ssh/config 中执行以下操作:

Host github.com
    User git
    IdentityFile ~/.ssh/githubKey

当您有许多身份而服务器不会因为您首先尝试错误的身份而拒绝您时,这具有优势。只会尝试特定的身份。

于 2010-11-22T15:08:59.043 回答
133

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

ssh-add -K ~/.ssh/your_private_key

对于 macOS 10.12 及更高版本,您需要额外编辑您的 ssh 配置,如下所述:https ://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain

于 2015-01-20T08:25:29.370 回答
127

在 Mac OS X Lion 下,这并没有为我解决同样的问题。我最终添加了:

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

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

(这里建议:http: //geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/

于 2012-08-06T16:22:14.947 回答
45

只需添加钥匙串,如 Ubuntu 快速提示 https://help.ubuntu.com/community/QuickTips中所述

什么

可以使用钥匙串来管理您的 ssh 密钥,而不是不断地启动 ssh-agent 和 ssh-add。要安装钥匙串,您只需单击此处,或使用 Synaptic 来完成这项工作或从命令行 apt-get。

命令行

另一种安装文件的方法是打开终端(Application->Accessories->Terminal)并输入:

sudo apt-get install keychain

编辑文件

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

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh
于 2016-05-16T14:32:53.863 回答
19

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

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

编辑:正如@Aaron 在评论中指出的那样,该.zshrc文件是从zsh外壳中使用的——所以如果你不使用它(如果你不确定,那么很可能你正在使用bash),这段代码应该转到您的.bashrc文件。

于 2014-03-08T12:54:02.517 回答
15

我在 Ubuntu 16.04 上遇到了同样的问题:一些键是永久添加的,而另一些键我必须ssh-add在每个会话中执行。我发现永久添加的密钥同时具有私钥和公钥,~/.ssh并且在每个会话中忘记的密钥只有~/.sshdir 中的私钥。所以解决方案很简单:您应该在执行之前将私钥和公钥复制到。~/.sshssh-add

PS:据我从Gnome wiki了解到,我的方法之所以有效,要归功于 gnome-keyring 工具,它是 Gnome 桌面环境的一部分。因此,我的方法可能仅在您使用 Gnome 或基于 Gnome 的 DE 时才有效。

于 2018-07-10T15:29:29.480 回答
14

就我而言,解决方案是:

配置文件的权限应该是 600。chmod 600 config

正如generalopinion在上面的评论中提到的

无需触摸配置文件内容。

于 2014-05-19T09:37:35.413 回答
5

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

检查两者之间的差异,我看到我的个人密钥有 400 个权限,而公司的密钥有 600 个权限。(有 u+w)。从公司密钥中删除用户写入权限(uw 或设置为 400)解决了我的问题。ssh-add 现在记住这两个键。

于 2017-01-24T22:12:39.353 回答
4

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

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)"
于 2015-05-13T15:55:48.843 回答
4

这对我有用。

ssh-agent /bin/sh
ssh-add /path/to/your/key
于 2017-04-02T06:47:40.240 回答
3

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

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

很简单^_^两步

1.yum安装钥匙串

2.将以下代码添加到.bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
于 2016-02-03T11:45:59.757 回答
3

对于那些使用 Fish shell 的用户,您可以使用以下函数,然后~/.config/fish/config.fish~/.config/fish/conf.d/loadsshkeys.fish. 它会将所有以id_rsa开头的键加载到ssh-agent.

# 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打开终端时自动启动,您可以使用danhper/fish-ssh-agent来执行此操作。

于 2017-12-26T08:21:51.910 回答