Git 登录时启动ssh代理
我有一个站点,作为使用SSH别名从Bitbucket.com提取的远程Git repo。我可以在服务器上手动启动ssh代理,但每次通过ssh登录时都必须这样做 我手动启动ssh代理:Git 登录时启动ssh代理,git,ssh,bitbucket,redhat,ssh-agent,Git,Ssh,Bitbucket,Redhat,Ssh Agent,我有一个站点,作为使用SSH别名从Bitbucket.com提取的远程Git repo。我可以在服务器上手动启动ssh代理,但每次通过ssh登录时都必须这样做 我手动启动ssh代理: eval ssh-agent $SHELL 然后我添加代理: ssh-add ~/.ssh/bitbucket_id 当我这样做时,它就会出现: ssh-add -l 我可以走了。有没有办法使这个过程自动化,这样我就不必每次登录都这样做?服务器正在运行RedHat 6.2(圣地亚哥)。请仔细阅读本文。您可能会
eval ssh-agent $SHELL
然后我添加代理:
ssh-add ~/.ssh/bitbucket_id
当我这样做时,它就会出现:
ssh-add -l
我可以走了。有没有办法使这个过程自动化,这样我就不必每次登录都这样做?服务器正在运行RedHat 6.2(圣地亚哥)。请仔细阅读本文。您可能会发现这非常有用: 以防有一天上述链接消失,我将捕获以下解决方案的主要部分: 此解决方案由Joseph M.Reagle通过Daniel Starin提供: 将以下内容添加到您的
.bash\u配置文件中
SSH_ENV="$HOME/.ssh/agent-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
这个版本特别好,因为它会查看您是否已经启动了ssh代理,如果找不到它,它会启动它并存储设置,以便下次启动shell时可以使用它们
老问题,但我确实遇到了类似的情况。不要认为上面的答案完全达到了需要的程度。缺少的部件是钥匙链
;如果尚未安装,请安装它
sudo apt-get install keychain
然后将以下行添加到~/.bashrc
eval $(keychain --eval id_rsa)
vim ~/.zshrc
这将启动ssh代理
,如果它没有运行,则连接到它,将ssh代理
环境变量加载到shell中,并加载ssh密钥
将id\u rsa
更改为~/.ssh
中要加载的任意私钥
钥匙链的一些有用选项:
-q
安静模式
--noask
启动时不要求输入密码,而是在实际使用ssh密钥时要求输入密码
参考
公认的解决方案有以下缺点:
- 维护复杂李>
- 评估可能导致错误或安全漏洞的存储文件李>
- 它启动代理但不停止代理,这几乎相当于将钥匙留在点火开关中
如果您的密钥不需要输入密码,我建议使用以下解决方案。将以下内容添加到您的.bash\u配置文件中
最末尾(根据您的需要编辑密钥列表):
execssh代理$BASH-s10我通过将其添加到/etc/profile-system-wide(或用户local.profile或.BASH\u配置文件)解决了这个问题:
#SSH-AGENT
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`WHOAMI | awk'{print$1}'`
如果pgrep-u$WHOAMI$SERVICE>/dev/null
然后
echo$服务正在运行。
其他的
echo$服务未运行。
回声启动
ssh代理>~/.ssh/agent\u env
fi
. ~/.ssh/agent\u env
如果未为当前用户运行,则会启动一个新的ssh代理,如果正在运行,则会重新设置ssh agent env参数。的用户可以使用此功能执行相同的操作
#内容必须位于.config/fish/config.fish中
#如果该文件不存在,请创建该文件
setenv SSH_ENV$HOME/.SSH/environment
函数启动代理
echo“正在初始化新的SSH代理…”
ssh代理-c|sed的/^echo/#echo/'>$ssh\u ENV
回声“成功”
chmod 600美元SSH_环境
. $SSH_ENV>/dev/null
ssh添加
结束
功能测试
ssh add-l | grep“代理没有标识”>/dev/null
如果[$状态-等式0]
ssh添加
如果[$状态-等式2]
启动代理
结束
结束
结束
如果[-n“$SSH\u AGENT\u PID”]
ps-ef | grep$SSH | AGENT | PID | grep SSH AGENT>/dev/null
如果[$状态-等式0]
测试单位身份
结束
其他的
如果[-f$SSH_ENV]
. $SSH_ENV>/dev/null
结束
ps-ef | grep$SSH|u AGENT|u PID | grep-v grep | grep SSH AGENT>/dev/null
如果[$状态-等式0]
测试单位身份
其他的
启动代理
结束
结束
因此,我过去使用上述方法,但我有点希望代理在上一次bash会话结束时死亡。这比其他解决方案要长一点,但这是我首选的方法。基本思想是第一个bash会话启动ssh代理。然后,每个额外的bash会话都会检查配置文件(~/.ssh/.agent_env
)。如果存在,并且有一个会话正在运行,则为环境提供源代码,并在/tmp
中创建指向套接字文件的硬链接(需要与原始套接字文件位于同一文件系统上)。bash会话关闭时,每个会话都会删除自己的硬链接。要关闭的最后一个会话将发现硬链接有2个链接(硬链接和原始链接),删除进程自己的套接字并终止进程将导致0,在最后一个bash会话关闭后留下一个干净的环境
#启动ssh代理要使用密钥保持登录,请使用'ssh add'登录
agent=`pgrep ssh agent-u$USER`#仅获取您的代理
如果[[“$agent”==”||!-e~/.ssh/.agent|env]];然后
#如果没有缺少代理或环境文件,请创建一个新的代理或环境文件
#删除旧的代理/环境变量文件
停止运行$agent
rm~/.ssh/.agent\u env
#重新启动
eval`ssh代理`
echo'export SSH\u AUTH\u SOCK'=$SSH\u AUTH\u SOCK>>~/.SSH/.agent\u env
echo'export SSH\u AGENT\u PID'=$SSH\u AGENT\u PID>>~/.SSH/.AGENT\u env
fi
#创建我们自己到套接字的硬链接(使用随机名称)
source~/.ssh/.agent\u env
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln-T$SSH\u AUTH\u SOCK$MYSOCK
导出SSH\u AUTH\u SOCK=$MYSOCK
[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
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"
systemctl --user enable ssh-agent
systemctl --user start ssh-agent
AddKeysToAgent yes
vim ~/.zshrc
plugins=(ssh-agent git)