如何在Ubuntu上使用ssh-add永久添加私钥?[关闭]


474

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

我有2台Linux(ubuntu 10.04)机器,并且ssh-add命令的行为在两者中均不同。

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

在另一种方法中,每次登录时都必须添加密钥。

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

有谁知道如何将其永久添加到另一台计算机上?


1
代理人只能是临时的;但可能您在两台机器中的〜/ .bashrc左右某处都有ssh-add命令
mirek '18

Answers:


631

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

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

如果〜/ .ssh目录中没有“ config”文件,则应创建一个。它不需要root权限,因此只需:

nano ~/.ssh/config

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

为此,文件必须具有chmod600。您可以使用命令chmod 600 ~/.ssh/config

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

另外,如果要设置特定于一台主机的密钥,则可以在〜/ .ssh / config中执行以下操作:

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

当您有许多身份时,这样做的好处是服务器不会拒绝您,因为您首先尝试了错误的身份。仅尝试特定的身份。


82
在配置文件的权限应该是600chmod 600 config
generalopinion

6
对于每次推送,提取或克隆都必须输入密码,如何避免这种情况?
Asaf 2014年

9
改用ssh-add ~/.ssh/gitHubKey,它会记住您的关键密码。我建议的解决方案是在重新启动后将其永久设置。
daminetreg 2014年

28
这个答案是如此之好,以至于ssh-add不应该存在。当您可以永久编辑配置文件时,谁希望拥有一个“临时”可解决问题并意外中断的命令。
RussellStewart

2
问题在于这种配置,如果您没有在.ssh / config中为特定主机执行此配置,则每次都会对所有服务器尝试所有密钥。
daminetreg 2014年

118

在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/


6
我认为这比我提出的解决方案更好,因为ssh-add使用了身份验证代理,该代理可以记住受保护的私钥的密码,因此您无需在每次尝试进行身份验证时都键入它。您提出的解决方案的另一个优点是,如果您有很多密钥,则ssh客户端将不会提出与您尝试连接的服务器无关的密钥,实际上,它将仅提供用于该服务器的密钥,并且不会。尝试尝试ssh / config中列出的所有密钥时,导致服务器由于达到MaxAuthTries而拒绝连接。
daminetreg

1
谢谢@daminetreg。我的特殊问题是需要在开发计算机上访问gitosis而不将我的私钥转让给它。该解决方案(以及添加ForwardAgent yes到my中.ssh/config)完美地解决了该问题。事实证明,这可能只是ssh-add &>/dev/null因为默认行为ssh-add是添加在.ssh文件夹中找到的键。
亚伦

1
我的理解是,有在Mac OS中一个-K开关:stackoverflow.com/questions/1909651/...
Nicu的Tofan

3
@TNick -K将密钥添加到OS X的钥匙串中,OS X GUI用来对外部服务器进行身份验证。该问题中的发布者正在通过SSH隧道进行连接,但仍仅与远程服务器连接。A- [SSH隧道]-> B我所处的情况是我在远程服务器上,但希望身份验证针对我的家庭系统上的凭据。A < - [验证] - - [连接] - “ç所以-K实际上不帮助,但对于其他Q.很好的解决方案
亚伦

112

我通过对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


3
对于想要永久设置它的人来说,这是一个更好的答案
punkrockpolly

12
因此,此位:“在Mac OSX(10.10)上” ...
Andrew K.

1
这很好,可以在Mac OSX上运行,但不能在Ubuntu(我测试中为14.04)上运行。
haxpor

5
这对我不起作用(在OSX 10.12.4上)
guptron

2
根据man ssh-addmacOS High Sierra上的描述,ssh-add -K会将密码短语保存到钥匙串中,并且在重启后,只需使用即可ssh-add -A,它不需要您输入密码短语。
DawnSong

36

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

什么

不必不断启动ssh-agent和ssh-add,而是可以使用钥匙串来管理ssh密钥。要安装钥匙串,只需单击此处,或使用Synaptic从命令行执行作业或apt-get。

命令行

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

sudo apt-get install keychain

编辑档案

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

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

出于好奇,第二条命令究竟是做什么的?这只是向当前用户打开权限?
文森特·布斯卡洛

1
.source
Brad Solomon

18

我尝试了@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文件是从zshshell中使用的-因此,如果您不使用它(如果不确定,那么很可能是使用了它bash),此代码应转到您的.bashrc文件。


3
.zshrc是用于zshshell的,我用代替bash。如果您使用的bash是Mac OS X(默认设置),它也将.bashrc存在。
亚伦

1
之后ssh-add -l返回码echo $?可用于决定是否添加关键与否。我的Linux计算机使用bash,ssh-add -l不会输出密钥文件名。返回代码始终有效。
Bharat G 2015年

12

就我而言,解决方案是:

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

如上文评论所述

无需触摸配置文件内容。


在Linux Mint 17.1上对我来说还不够。
贝纳雷斯

我认为600没有意义。man ssh告诉我们该~/.ssh/config文件是为用户读取/写入的,并且不能被其他用户写入。
DawnSong

仅为用户读取和写入600
Enthusiasmus

6

我在Ubuntu 16.04上遇到了同样的问题:某些键被永久添加,而另一些则必须ssh-add在每个会话中执行。我发现,永久添加的密钥位于私钥和公钥中~/.ssh,而每次会话中忘记的密钥在~/.sshdir中只有私钥。因此,解决方法很简单:你应该复制这两个私钥和公钥来~/.ssh执行前ssh-add

PS:据我从Gnome Wiki所了解,我的方法可以使用gnome-keyring工具,该工具是Gnome桌面环境的一部分。因此,仅当您使用Gnome或基于Gnome的DE时,我的方法才可能起作用。


1
被低估的答案。搜索两个小时后,无需其他脚本或软件包即可解决了我的问题。
etagenklo

Flarkin很棒!出色的侦探工作。我认为我不会想到这一点。
nicorellius

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)"

3

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

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

3

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

查看两者之间的区别,我发现我的私人钥匙拥有400个权利,而公司之一拥有600个权利。(有u + w)。从公司密钥中删除用户写权限(uw或设置为400)解决了我的问题。ssh-add现在可以记住两个键。



1

很简单的^ _ ^两步

1.yum安装钥匙扣

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

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

12
Ubuntu没有傻吗;)
Adam F

1

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

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.