Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 登录时启动ssh代理_Git_Ssh_Bitbucket_Redhat_Ssh Agent - Fatal编程技术网

Git 登录时启动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(圣地亚哥)。请仔细阅读本文。您可能会

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

我手动启动ssh代理:

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)