38

I have msysgit installed, with OpenSSH. I am connecting to a gitosis repo. From the git bash, I have created a .profile file that runs ssh-agent (if not already running) each time git bash is opened, using this script

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

I am also using git extensions, which runs the git command from the Windows command prompt, not git bash. So, ssh doesn't see the ssh-agent that is running. Is it possible to fix this?

Braiam
  • 1
  • 11
  • 47
  • 78
Jacko
  • 12,665
  • 18
  • 75
  • 126
  • For info: I didn't manage to have ssh-agent work reliably on Windows 10 with git bash 2.x (following the [github guide](https://help.github.com/articles/working-with-ssh-key-passphrases/)) but I had more luck with putty. See [this amazing answer: "Why git can't remember my passphrase under Windows"](https://stackoverflow.com/a/4356869/245966) – jakub.g Aug 02 '18 at 09:56

7 Answers7

47

I had the same problem as you, then I tried adding this code

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

into file .bashrc in my home directory. And it works!

bricklore
  • 4,125
  • 1
  • 34
  • 62
Fery W
  • 1,402
  • 1
  • 15
  • 28
  • This worked for me. I think my particular problem was that I needed to specify the _rsa file I needed to use. – Syntax Error Jun 30 '15 at 15:29
  • Thanks @bricklore :) – Fery W Jan 19 '16 at 14:32
  • Repeatedly exiting and opening new bash sessions was causing a new ssh-agent.exe to be spawned with every new session. The solution in the article linked to in @Braiam's answer prevents that for me. – Sean Mar 30 '17 at 19:13
27

For msysgit you might have to modify a bit the solution offered by 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

As you may notice the only change I did was in the ps call, since msysgit don't use -U but -u

Braiam
  • 1
  • 11
  • 47
  • 78
  • 3
    Note that [the article on GitHub](https://help.github.com/articles/working-with-ssh-key-passphrases/#platform-windows) provides a simpler (probably more solid) version of this script. – Ignitor Mar 19 '15 at 09:25
  • They seem to have updated their code. Is your customized version still necessary, I wonder? I recommend just trying the solution in the article first. – Sean Mar 30 '17 at 19:10
23

Even though you've probably solved it... use the eval command to make the ssh_agent process stick:

eval `ssh-agent.exe`

Then use ssh-add to add the keys you need.

Andy
  • 5,108
  • 3
  • 26
  • 37
Cu7l4ss
  • 556
  • 1
  • 8
  • 19
  • This spawns a new `ssh-agent` top-level process every time you open a git bash. – Oliver Salzburg Sep 27 '13 at 11:06
  • Ahh you see, not really at least not when I checked it, if I recall correctly, it checks to see if there is one running already else it does spawn the process. nowadays they fixed it, so there is no reason to use this anymore – Cu7l4ss Oct 13 '13 at 08:27
  • @Cu7l4ss If they fixed it then why am I having this problem??? -- I can start up the ssh-agent and add the key just fine... but then it is instantly gone and 'ssh-add -l' returns "the agent has no identities". The only way I even got this far was by the command you listed. -- Just fyi, still a current issue. – Zeveso Nov 03 '13 at 21:03
  • Repeatedly exiting and opening new bash sessions was causing a new ssh-agent.exe to be spawned with every new session. The solution in the article linked to in @Braiam's answer prevents that for me. – Sean Mar 30 '17 at 19:13
11

On Windows 10 this worked for me

  1. run git bash
  2. touch ~/.profile
  3. start ~/.profile to open .profile
  4. add the following to .profile
#! /bin/bash 
eval `ssh-agent -s` 
ssh-add ~/.ssh/*_rsa

This is based on this answer. The only difference is that .bashrc did not work, instead .profile worked.

Community
  • 1
  • 1
Thoran
  • 8,884
  • 7
  • 41
  • 50
2

I found the smoothest way to achieve this was using Pageant as the SSH agent and plink.

You need to have a putty session configured for the hostname that is used in your remote.

You will also need plink.exe which can be downloaded from the same site as putty.

And you need Pageant running with your key loaded. I have a shortcut to pageant in my startup folder that loads my SSH key when I log in.

When you install git-scm you can then specify it to use tortoise/plink rather than OpenSSH.

The net effect is you can open git-bash whenever you like and push/pull without being challenged for passphrases.

Same applies with putty and WinSCP sessions when pageant has your key loaded. It makes life a hell of a lot easier (and secure).

Alasdair
  • 91
  • 1
  • 1
1

You could wrap your git executable with a script that sources your .profile, causing the ssh-agent environment variables to be loaded.

Either put a script called git in a directory earlier in your path than the real git, or configure the git extensions to call your wrapper in place of the real git.

Andrew Aylett
  • 39,182
  • 5
  • 68
  • 95
0

Simple two string solution from this answer:

# ~/.profile
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi
. ~/.ssh-agent.sh
oklas
  • 7,935
  • 2
  • 26
  • 42