我有一个受密码保护的私钥,可以通过 SSH 访问服务器。
我有 2 台 linux (ubuntu 10.04) 机器,并且 ssh-add 命令的行为在它们中都不同。
在一台机器上,一旦我使用“ssh-add .ssh/identity”并输入我的密码,密钥就会被永久添加,即每次我关闭计算机并再次登录时,密钥已经被添加。
在另一个中,我每次登录时都必须添加密钥。
据我记得,我对两者都做了同样的事情。唯一的区别是密钥是在永久添加的密钥上创建的。
有谁知道如何将它永久添加到另一台机器上?
一种解决方案是通过将密钥文件添加到您的文件中来强制永久保留它们~/.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
当您有许多身份而服务器不会因为您首先尝试错误的身份而拒绝您时,这具有优势。只会尝试特定的身份。
我通过使用 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
在 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/)
只需添加钥匙串,如 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
我尝试了@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文件。
我在 Ubuntu 16.04 上遇到了同样的问题:一些键是永久添加的,而另一些键我必须ssh-add在每个会话中执行。我发现永久添加的密钥同时具有私钥和公钥,~/.ssh并且在每个会话中忘记的密钥只有~/.sshdir 中的私钥。所以解决方案很简单:您应该在执行之前将私钥和公钥都复制到。~/.sshssh-add
PS:据我从Gnome wiki了解到,我的方法之所以有效,要归功于 gnome-keyring 工具,它是 Gnome 桌面环境的一部分。因此,我的方法可能仅在您使用 Gnome 或基于 Gnome 的 DE 时才有效。
就我而言,解决方案是:
配置文件的权限应该是 600。
chmod 600 config
正如generalopinion在上面的评论中提到的
无需触摸配置文件内容。
我使用两个 id_rsa 密钥运行 Ubuntu。(一个个人的工作)。ssh-add 每次都会记住一把钥匙(个人一把)而忘记公司一把。
检查两者之间的差异,我看到我的个人密钥有 400 个权限,而公司的密钥有 600 个权限。(有 u+w)。从公司密钥中删除用户写入权限(uw 或设置为 400)解决了我的问题。ssh-add 现在记住这两个键。
在“~/.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)"
这对我有用。
ssh-agent /bin/sh
ssh-add /path/to/your/key
在 Ubuntu 14.04(可能更早,可能仍然)上,您甚至不需要控制台:
seahorse或启动您在搜索“密钥”时找到的那个东西ssh将通过代理获取身份(即密钥)sshwith-A或将其设为默认值
很简单^_^两步
1.yum安装钥匙串
2.将以下代码添加到.bash_profile
/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
对于那些使用 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来执行此操作。