我有一个网站作为远程Git repo,使用SSH别名从Bitbucket.com拉取。我可以在服务器上手动启动ssh-agent,但每次通过SSH登录时都必须这样做。
我手动启动ssh-agent:
eval ssh-agent $SHELL
然后添加代理:
ssh-add ~/.ssh/bitbucket_id
然后,当我这样做时,它就会出现:
ssh-add -l
我可以走了。有没有办法让这个过程自动化,这样我就不必每次登录都这么做了?服务器运行的是RedHat 6.2 (圣地亚哥)。
发布于 2016-08-17 01:25:30
在Arch Linux上,下面的工作非常棒(应该可以在所有基于systemd的发行版上工作):
通过将以下内容放入~/.config/systemd/user/ssh-agent.service
,创建一个systemd用户服务
[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, ...
):
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"
启用服务,这样它将在登录时自动启动,并启动它:
systemctl --user enable ssh-agent
systemctl --user start ssh-agent
将以下配置设置添加到本地ssh配置文件~/.ssh/config
(自SSH7.2起即可使用):
AddKeysToAgent yes
这将指示ssh客户端始终将密钥添加到正在运行的代理中,因此不需要事先使用ssh添加密钥。
发布于 2016-07-28 01:28:11
将其添加到您的~/.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
这应该只会在您每次重新启动后第一次登录时提示输入密码。只要它保持运行,它就会一直重用相同的ssh-agent
。
发布于 2015-09-16 01:46:30
因此,我过去常常使用上面描述的方法,但我更希望代理在我的最后一个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
https://stackoverflow.com/questions/18880024
复制相似问题