获取ssh-agent使用从Windows命令shell运行的git

问题描述:

我使用OpenSSH安装了msysgit。我正在连接到一个gitosis回购。从混帐bash中,我创建了一个.profile文件运行的ssh-agent(如果尚未运行),每次git的庆典被打开,using this script获取ssh-agent使用从Windows命令shell运行的git

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 

我也使用Git扩展,从运行的git命令Windows命令提示符,而不是git bash。所以,ssh没有看到正在运行的ssh-agent。有没有可能解决这个问题?

你可以用你的.profile的脚本包装你的git可执行文件,导致加载ssh-agent环境变量。

要么将​​一个名为git的脚本放在路径中比实际git更早的目录中,要么将git扩展配置为调用您的包装来代替真正的git。

即使你可能已经解决了吧...使用eval命令使ssh_agent过程棒:

eval `ssh-agent.exe` 

然后使用ssh-add添加你需要的按键。

+0

这每次打开一个git bash的时候产生一个新的'SSH-agent'*流程。 – 2013-09-27 11:06:27

+0

啊,你看,不是真的,至少当我检查它,如果我没有记错,它检查是否有一个已经运行,否则它会产生过程。现在他们固定它,所以没有理由再使用这个 – Cu7l4ss 2013-10-13 08:27:11

+0

@ Cu7l4ss如果他们修复它,那么为什么我有这个问题? - 我可以启动ssh-agent并添加密钥,但是这会立即消失,'ssh-add -l'返回“代理没有身份”。我甚至得到这个目标的唯一方法就是你列出的命令。 - 只是fyi,目前还是个问题。 – Zeveso 2013-11-03 21:03:33

对于msysgit您可能需要修改了一下解决方案提供由https://help.github.com/articles/working-with-ssh-key-passphrases

declare -x SSH_ENV="$HOME/.ssh/environment" 

# start the ssh-agent 
function start_agent { 
    echo "Initializing new SSH agent..." 
    # spawn ssh-agent 
    ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV" 
    echo succeeded 
    chmod 600 "$SSH_ENV" 
    . "$SSH_ENV" > /dev/null 
    ssh-add 
} 

# test for identities 
function test_identities { 
    # test whether standard identities have been added to the agent already 
    ssh-add -l | grep "The agent has no identities" > /dev/null 
    if [ $? -eq 0 ]; then 
     ssh-add 
     # $SSH_AUTH_SOCK broken so we start a new proper agent 
     if [ $? -eq 2 ];then 
      start_agent 
     fi 
    fi 
} 

# check for running ssh-agent with proper $SSH_AGENT_PID 
if [ -n "$SSH_AGENT_PID" ]; then 
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null 
    if [ $? -eq 0 ]; then 
    test_identities 
    fi 
else 
    if [ -f "$SSH_ENV" ]; then 
    . "$SSH_ENV" > /dev/null 
    fi 
    ps -f -u $USERNAME | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null 
    if [ $? -eq 0 ]; then 
     test_identities 
    else 
     start_agent 
    fi 
fi 

正如你可能会注意到我所做的是在PS呼叫唯一的变化,因为msysgit不要使用-U但 - ü

+2

请注意,[GitHub上的文章](https://help.github.com/articles/working-with-ssh-key-passphrases/#platform-windows)提供了一个更简单(可能更稳固)的此脚本版本。 – Ignitor 2015-03-19 09:25:07

+0

他们似乎已经更新了他们的代码。我想知道你的定制版本是否必要?我建议只是先尝试​​文章中的解决方案。 – Sean 2017-03-30 19:10:20

我有同样的问题,因为你的话,我试着在我的主目录添加此代码

#! /bin/bash 
eval `ssh-agent -s` 
ssh-add ~/.ssh/*_rsa 

到文件.bashrc。它的工作原理!

+0

这对我有用。我认为我特别的问题是我需要指定我需要使用的_rsa文件。 – 2015-06-30 15:29:23

+0

谢谢@bricklore :) – 2016-01-19 14:32:33

+0

反复退出并打开新的bash会话导致每次新会话都会产生一个新的ssh-agent.exe。在@ Braiam的答案中链接到的文章中的解决方案阻止了我。 – Sean 2017-03-30 19:13:14

我发现实现这一目标最顺利的方式是使用Pageant作为SSH代理和plink。

您需要为远程中使用的主机名配置putty会话。

您还需要plink.exe,它可以从与putty相同的站点下载。

而且你需要佩戴你的钥匙的Pageant运行。我在我的启动文件夹中有一个快捷方式,用于登录时加载我的SSH密钥。

当您安装git-scm时,可以指定它使用tortoise/plink而不是OpenSSH。最终效果是你可以随时打开git-bash,并且推/拉而不会对密码提出挑战。

同样适用于putty和WinSCP会话,当pageant加载密钥时。它让生活变得更加简单(和安全)。

在Windows 10这个工作对我来说

  1. 运行git bash的
  2. touch ~/.profile
  3. start ~/.profile打开.profile
  4. 以下添加到.profile
#! /bin/bash 
eval `ssh-agent -s` 
ssh-add ~/.ssh/*_rsa 

这是基于this answer。唯一的区别是.bashrc没有工作,而是.profile工作。

+0

upvote for'touch' – 2016-10-07 07:40:15

+0

这对我有用。谢谢!! – nonintanon 2017-11-18 20:04:03

简单的两线解决方案this answer

# ~/.profile 
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi 
. ~/.ssh-agent.sh