登录时启动ssh-agent

Pat*_*ign 230 git ssh redhat bitbucket ssh-agent

我有一个站点作为远程Git repo从Bitbucket.com使用SSH别名拉.我可以在我的服务器上手动启动ssh-agent,但每次通过SSH登录时都必须这样做.

我手动启动ssh-agent:

eval ssh-agent $SHELL
Run Code Online (Sandbox Code Playgroud)

然后我添加代理:

ssh-add ~/.ssh/bitbucket_id
Run Code Online (Sandbox Code Playgroud)

然后它出现在我做的时候:

ssh-add -l
Run Code Online (Sandbox Code Playgroud)

我很高兴去.有没有办法自动化这个过程,所以我不必每次登录都这样做?服务器正在运行RedHat 6.2(Santiago).

Lit*_*mus 337

请仔细阅读这篇文章.您可能会发现这非常有用:

http://mah.everybody.org/docs/ssh

为了防止上述链接在某一天消失,我正在捕捉下面解决方案的主要部分:

Joseph M. Reagle的解决方案来自Daniel Starin:

将以下内容添加到您的 .bash_profile

SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initialising new 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;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    #ps ${SSH_AGENT_PID} doesn't work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi
Run Code Online (Sandbox Code Playgroud)

这个版本特别好看,因为它会看到你是否已经启动了ssh-agent,如果它找不到它,它将启动并存储设置,以便下次启动时它们可以使用贝壳.

  • 使用``SSH_ENV ="$ HOME/.ssh/env"``(即不是/环境)为什么?sshd使用〜/ .ssh/environment(参见手册页:PermitUserEnvironment).Github还在他们的解决方案中推荐了这个 - https://help.github.com/articles/working-with-ssh-key-passphrases#auto-launching-ssh-agent-on-msysgit (9认同)
  • 无需重启机器.你可以在当前的shell会话中使用`source~/.bash_profile`重新加载`.bash_profile`.机器重启也会起作用,因为无论如何都会加载新的配置. (7认同)
  • 当我把它放在我的〜/ .bashrc文件中时(不是我的〜/ .profile或〜/ .bash_profile),这个脚本对我有用.我第一次打开一个本地控制台时会提示输入密码,一切都可以在没有进一步提示的情况下从那一点开始工作.干杯. (7认同)
  • 仍然很烦人......每次登录都必须这样做...即使你不使用ssh.每次调用ssh时都需要关闭它...理想情况下,您应该能够配置哪些主机导致加载哪些密钥. (4认同)
  • 在.bashrc中添加`ssh-agent` start命令将使`scp`命令不起作用。 (2认同)
  • 创建.ssh / environment文件,然后chmod 600将其打开一个简短的时间段。使用umask更安全:```OLD_UMASK = $(umask 077); / usr / bin / ssh-agent | sed's / ^ echo /#echo /'>“ $ {SSH_ENV}”; umask $ {OLD_UMASK}``` (2认同)

sph*_*nik 83

在Arch Linux上,以下工作非常棒(应该适用于所有基于systemd的发行版):

通过将以下内容添加到以下内容来创建systemd用户服务~/.config/systemd/user/ssh-agent.service:

[Unit]
Description=SSH key agent

[Service]
Type=forking
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)

安装shell以获得socket(.bash_profile, .zshrc, ...)的环境变量:

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"
Run Code Online (Sandbox Code Playgroud)

启用该服务,因此它将在登录时自动启动,并启动它:

systemctl --user enable ssh-agent
systemctl --user start ssh-agent
Run Code Online (Sandbox Code Playgroud)

将以下配置设置添加到ssh配置文件~/.ssh/config(这可以从SSH 7.2开始):

AddKeysToAgent  yes
Run Code Online (Sandbox Code Playgroud)

这将指示ssh客户端始终将密钥添加到正在运行的代理,因此不需要事先ssh-add.

  • 我认为解决方案是最好的。它只需要被发行版采用即可。如果您希望在连接到 git 时自动尝试多个密钥,请参阅 /sf/ask/169369651/ (4认同)
  • 我在Ubuntu尝试这个时发现了这个评论.它似乎比内置系统更好地发挥作用,而不是在启动脚本中进行黑客攻击,至少考虑到我对系统应该如何工作的了解. (3认同)
  • 刚刚在Ubuntu 18.04中尝试过。完美无瑕! (2认同)
  • 那么,该解决方案是否基本上是安装/配置systemd服务(但仅针对用户)? (2认同)
  • 我喜欢这个答案,因为它使用专门为运行守护进程(systemd)而设计的基础设施,而不是带有变量的 shell 脚本黑客。 (2认同)
  • 对于那些像我一样在实施他们找到的第一个答案之前交叉引用多个来源的人......这个答案与 https://wiki.archlinux.org/title/SSH_keys#SSH_agents 一致 (2认同)

xel*_*ber 56

老问题,但我确实遇到过类似的情况.不要以为上述答案完全实现了所需要的.缺少的是keychain; 安装它,如果它还没有.

sudo apt-get install keychain
Run Code Online (Sandbox Code Playgroud)

然后将以下行添加到您的 ~/.bashrc

eval $(keychain --eval id_rsa)
Run Code Online (Sandbox Code Playgroud)

ssh-agent如果它没有运行,则启动它,如果是,则连接到它,将ssh-agent环境变量加载到shell中,然后加载ssh密钥.

更改id_rsa~/.ssh要加载的私钥.

参考

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt

  • 根据给出的说明,钥匙串对我不起作用。我添加到 .bash_profile 并且 ssh 每次仍然要求输入密码。我在同一个 shell 中尝试了多次。没有骰子。回到基本的 ssh-agent 方法 (4认同)
  • 由于StackOverflow注释格式化,我花了20分钟研究解决方案.按照上面的xelber评论,正确的解决方案是`eval \`keychain --eval id_ [yourid file] \``to` .bashrc`.反向标记需要将环境变量评估到当前shell以访问正在运行的ssh-agent. (4认同)
  • 谢谢,这是迄今为止最优雅的解决方案。 (3认同)
  • 目前的解决方案“eval $(keychain --eval id_rsa)”对我不起作用,直到我将“--agents ssh”参数添加到钥匙串中,正如链接解决方案中建议的那样。 (3认同)
  • 这是正确和简单的解决方案。如果您不希望在执行keychain命令时看到日志,则可以为安静模式添加`-q`选项。有关钥匙串的更多信息:https://www.funtoo.org/Keychain (2认同)

mid*_*nok 37

公认的解决方案有以下缺点:

  • 维护起来很复杂;
  • 它评估可能导致错误或安全漏洞的存储文件;
  • 它启动代理但不会停止它,这相当于将钥匙保持在点火状态.

如果您的密钥不需要输入密码,我建议您使用以下解决方案.将以下内容添加到您的.bash_profile 最后(根据您的需要编辑密钥列表):

exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF
Run Code Online (Sandbox Code Playgroud)

它具有以下优点:

  • 更简单的解决方案;
  • 当bash会话结束时,代理会话结束.

它有可能的缺点:

  • 交互式ssh-add命令只影响一个会话,这实际上只是在非常不典型的情况下才是问题;
  • 如果需要输入密码则无法使用;
  • 启动shell变为非登录(不影响任何AFAIK).

请注意,多个ssh-agent进程不是缺点,因为它们不占用更多内存或CPU时间.

  • 我认为**"如果您的钥匙不需要输入密码"**就等于将钥匙保持在点火状态. (6认同)
  • 不要那样做.无密码密钥是一种不好的做法. (2认同)

Col*_*son 21

将此添加到您的~/.bashrc:

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add
Run Code Online (Sandbox Code Playgroud)

这应该只在每次重新启动后第一次登录时提示输入密码.ssh-agent只要它继续运行,它将继续重用.


Mic*_*cah 7

所以我过去常常使用上面描述的方法,但是当我上次的bash会话结束时,我更喜欢代理死掉.这比其他解决方案稍长,但这是我的首选方法.基本思想是第一个bash会话启动ssh-agent.然后每个额外的bash会话检查配置文件(~/.ssh/.agent_env).如果存在并且存在会话运行,则源环境并创建到套接字文件的硬链接/tmp(需要与原始套接字文件位于相同的文件系统上).当bash会话关闭时,每个会删除自己的硬链接.关闭的最后一个会话将发现硬链接有2个链接(硬链接和原始链接),删除进程自己的套接字并杀死进程将导致0,在最后一个bash会话关闭后留下一个干净的环境.

# Start ssh-agent to keep you logged in with keys, use `ssh-add` to log in
agent=`pgrep ssh-agent -u $USER` # get only your agents           
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
    # if no agents or environment file is missing create a new one
    # remove old agents / environment variable files
    kill $agent running
    rm ~/.ssh/.agent_env 

    # restart
    eval `ssh-agent` 
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env             
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env             
fi

# create our own hardlink to the socket (with random name)           
source ~/.ssh/.agent_env                                                    
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock                                        
ln -T $SSH_AUTH_SOCK $MYSOCK                                                
export SSH_AUTH_SOCK=$MYSOCK                                                

end_agent()                                                                     
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`                             
    if [[ "$nhard" -eq 2 ]]; then                                               
        rm ~/.ssh/.agent_env                                                    
        ssh-agent -k                                                            
    fi                                                                          
    rm $SSH_AUTH_SOCK                                                           
}                                                                               
trap end_agent EXIT                                                             
set +x              
Run Code Online (Sandbox Code Playgroud)


Kee*_*ego 6

为了添加另一个解决方案:P,我将@spheenik和@ collin-anderson的解决方案结合使用。

 # Ensure that we have an ssh config with AddKeysToAgent set to true
 if [ ! -f ~/.ssh/config ] || ! cat ~/.ssh/config | grep AddKeysToAgent | grep yes > /dev/null; then
     echo "AddKeysToAgent  yes" >> ~/.ssh/config
 fi
 # Ensure a ssh-agent is running so you only have to enter keys once
 if [ ! -S ~/.ssh/ssh_auth_sock ]; then
   eval `ssh-agent`
   ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
 fi
 export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
Run Code Online (Sandbox Code Playgroud)

可以稍微优雅一点,但它简单易读。此解决方案:

  • 确保AddKeysToAgent yes在您的ssh配置中,因此密钥将在使用后自动添加
  • 不会提示您在登录时输入任何密码短语(再次,第一次使用时会输入一次密码短语)
  • 如果尚未启动ssh代理,则以静默方式启动它

欢迎评论:)


Sha*_*rak 6

尝试了许多来源的解决方案,但似乎都太麻烦了。终于找到最简单的了 :)

如果您还不熟悉zshoh-my-zsh,请安装它。你会喜欢的 :)

然后编辑 .zshrc

vim ~/.zshrc
Run Code Online (Sandbox Code Playgroud)

找到plugins部分并更新它以使用ssh-agent如下:

plugins=(ssh-agent git)
Run Code Online (Sandbox Code Playgroud)

就这样!你必须ssh-agent启动和运行每次启动您的shell

  • 但登录时不行。zshrc 仅在用户打开终端时获取 (2认同)