一次输入SSH密码


124

升级前

当我运行git clone git@...(使用ssh)每台计算机重新启动一次时,会出现一个窗口对话框,其中包含用于插入我的SSH密码的文本框,并单击“确定”确认。然后,直到我的系统下次启动时,才不再需要密码短语。

升级到13.10之后

升级到Ubuntu 13.10后,该窗口不再出现,但终端中出现一条消息:

Enter passphrase for key '/home/username/.ssh/id_rsa': 

...每次克隆git存储库时都会出现。

我怎样才能解决这个问题?我只想输入一次密码。


1
我认为您必须为此使用ssh-add命令。你试过了吗?
devius

2
我试过ssh-agent bash+ ssh-add。那只能工作几分钟。
尼卡比曹

我毕竟有同样的问题。我认为这可能是OpenSSH的ssh-agent和Gnome Keyring守护程序之间的冲突。
devius


2
添加AddKeysToAgent yes到.ssh / config对我有用。
xslittlegrass

Answers:


138

更新:似乎是来自13.10的错误:

https://bugs.launchpad.net/ubuntu/+source/libpam-ssh/+bug/1247169


无论如何运行以下命令,该问题已为我解决:

怎么修

我通过输入以下命令解决了这个问题:

$ ssh-agent bash

这将创建一个新的bash进程,允许您添加私钥。添加新的私钥时,系统将提示您输入一次密码短语,并且只有一次。

接着:

$ ssh-add /home/username/.ssh/id_rsa
Enter passphrase for /home/username/.ssh/id_rsa: 
Identity added: /home/username/.ssh/id_rsa (/home/username/.ssh/id_rsa)

... username您的用户名在哪里 您可以使用$USER变量执行相同的操作:

$ ssh-add /home/$USER/.ssh/id_rsa

或者,仅~用于您的主目录。

$ ssh-add ~/.ssh/id_rsa

问题已解决。


47
这根本解决不了问题。它只会将身份添加到代理,直到您退出终端。如果您打开一个新终端,则必须ssh-add再次。
devius

@devius是的,似乎是一个错误。但是,上面的命令固定我的问题...
尼卡比曹

3
因此,请澄清一下:使用此“修复”,您不必再次在该终端中键入密码。打开新终端的那一刻-您将不得不再次输入密码。
harijay 2014年

9
我尝试了$ ssh-add /home/username/.ssh/id_rsa(没有ssh-agent bash),即使重新打开终端后它也对我有用。但对我来说,完整的解决方案是这个stackoverflow.com/a/4246809/532252。即使重新启动机器,一切都没问题。
kishie 2014年

1
我只是在终端输入ssh-add。无需切换到ssh-agent bash或指定id_rsa文件
henry74

39

0)简短答案

.ssh/config开头添加一行:

AddKeysToAgent yes

并运行git / ssh / ...如果还不够,请检查您的ssh版本并检查ssh-agent是否已加载以下说明:

1)检查openssh版本

首先检查您的ssh版本,它必须大于等于7.2

ssh -V

2)编辑配置文件

如果是这种情况,只需在.ssh/config开头添加一行:

AddKeysToAgent yes

3)检查ssh-agent是否已经打开

通常,发行版会自动加载ssh-agent。要检查它,运行

ps aux | grep -v grep | grep ssh-agent

如果看不到任何包含它的行,则需要通过运行以下命令来加载它:

eval $(ssh-agent)

请注意,这仅在当前终端上启用该代理,因此要在任何地方启用该代理,您可以尝试在~/.profile文件中添加此行并重新启动。


11
AddKeysToAgent yes是2016年后的标准答案– 正是大多数现代用户正在追求的目标。这是2017年中。Ubuntu> = 16.04(Xenial Xerus)现在是一个合理的假设。现在,大多数狂野的OpenSSH安装都支持此选项。其他所有对此问题的回答所倡导的特别的shell脚本冲突都是…… passé</sigh>
塞西尔·库里

2
这应该是公认的答案
simernes,

32

此Atlassian文档为我在Ubuntu 14.04 Server Edition上解决了该问题:

只需将此值添加到您的.bashrc文件中:

SSH_ENV=$HOME/.ssh/environment

# start the ssh-agent
function start_agent {
    echo "Initializing new SSH agent..."
    # spawn ssh-agent
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add
}

if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

登录后,它只要求输入一次密码并进行缓存。您无需每次都输入。


2
这似乎可以在其他发行版上使用,例如我刚刚在Sabayon Linux上成功使用了此答案。
BH2017

1
谢谢!该解决方案在ubuntu系统上对我有用,因为dbus-daemon的问题,gnome-keyring-daemon无法使用。具体来说,我得到这些错误“ **消息:无法连接到dbus会话总线:如果没有X11的$ DISPLAY,则无法自动启动dbus守护程序”,并且在设置了显示环境变量后,我得到了“ **消息:无法无法连接到dbus会话总线:// bin / dbus-launch异常终止,出现以下错误:自动启动错误:X11初始化失败。
user207863 '16

1
这需要更多的支持,可以很好地解决虚拟化Ubuntu 16.04上的问题。
Niels Keurentjes '16

3
这也为我在Windows的Bash上解决了该问题。我尝试多次启动Bash,但它记得密码。尚未尝试重新启动。
Amr

2
在尝试了所有其他解决方案之后,这对我有用。这应该是解决了OP
若昂·皮门特尔·费雷拉

20

此错误的解决方法是将以下内容添加到~/.bashrc

eval `gnome-keyring-daemon --start`

2
gnome钥匙圈不应该只是您会话的一部分吗?
PavelŠimerda2014年

1
如果您在谈论“应该”,那么,如果一切都那么完美,那么这个问题就不应该放在首位了
Anwar

1
不知道这是否属于.bashrc。看起来你必须将它添加到一些DE配置文件
梅德金兹伯格

3

该用户的鱼外壳可以使用该脚本做同样的事情。

# content has to be in .config/fish/config.fish
# if it does not exist, create the file
setenv SSH_ENV $HOME/.ssh/environment

function start_agent                                                                                                                                                                    
    echo "Initializing new SSH agent ..."
    ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
    echo "succeeded"
    chmod 600 $SSH_ENV 
    . $SSH_ENV > /dev/null
    ssh-add
end

function test_identities                                                                                                                                                                
    ssh-add -l | grep "The agent has no identities" > /dev/null
    if [ $status -eq 0 ]
        ssh-add
        if [ $status -eq 2 ]
            start_agent
        end
    end
end

if [ -n "$SSH_AGENT_PID" ] 
    ps -ef | grep $SSH_AGENT_PID | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    end  
else
    if [ -f $SSH_ENV ]
        . $SSH_ENV > /dev/null
    end  
    ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    else 
        start_agent
    end  
end


0

如果您使用Azure .ppk文件

只需将其转换为pem并通过简单的步骤添加权限400:

sudo apt-get install putty
puttygen <path_to_key>/keyname.ppk -O private-openssh -o <path>/aws_key.pem
sudo chmod 400 <path>/aws_key.pem
ssh -vi aws_key.pem ubuntu@<ip_address>

0

在Ubuntu 18.04上,打开会话X时会启动ssh-agent,它在文件/etc/X11/Xsession.options中进行管理:

# cat /etc/X11/Xsession.options
# $Id: Xsession.options 189 2005-06-11 00:04:27Z branden $
#
# configuration options for /etc/X11/Xsession
# See Xsession.options(5) for an explanation of the available options.
allow-failsafe
allow-user-resources
allow-user-xsession
use-ssh-agent
use-session-dbus
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.