首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >登录时启动ssh-agent

登录时启动ssh-agent
EN

Stack Overflow用户
提问于 2013-09-19 02:48:43
回答 5查看 320.7K关注 0票数 343

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

我手动启动ssh-agent:

代码语言:javascript
复制
eval ssh-agent $SHELL

然后添加代理:

代码语言:javascript
复制
ssh-add ~/.ssh/bitbucket_id

然后,当我这样做时,它就会出现:

代码语言:javascript
复制
ssh-add -l

我可以走了。有没有办法让这个过程自动化,这样我就不必每次登录都这么做了?服务器运行的是RedHat 6.2 (圣地亚哥)。

EN

回答 5

Stack Overflow用户

发布于 2016-08-17 01:25:30

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

通过将以下内容放入~/.config/systemd/user/ssh-agent.service,创建一个systemd用户服务

代码语言:javascript
复制
[Unit]
Description=SSH key agent

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

[Install]
WantedBy=default.target

将shell设置为具有套接字的环境变量(.bash_profile, .zshrc, ...):

代码语言:javascript
复制
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

启用服务,这样它将在登录时自动启动,并启动它:

代码语言:javascript
复制
systemctl --user enable ssh-agent
systemctl --user start ssh-agent

将以下配置设置添加到本地ssh配置文件~/.ssh/config (自SSH7.2起即可使用):

代码语言:javascript
复制
AddKeysToAgent  yes

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

票数 146
EN

Stack Overflow用户

发布于 2016-07-28 01:28:11

将其添加到您的~/.bashrc中,然后注销并重新登录才能生效。

代码语言:javascript
复制
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

这应该只会在您每次重新启动后第一次登录时提示输入密码。只要它保持运行,它就会一直重用相同的ssh-agent

票数 36
EN

Stack Overflow用户

发布于 2015-09-16 01:46:30

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

代码语言:javascript
复制
# 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              
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18880024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档