web-dev-qa-db-fra.com

Amener ssh-agent à fonctionner avec git run à partir du shell de commande Windows

J'ai installé msysgit avec OpenSSH. Je me connecte à un repo gitosis. Depuis git bash, j'ai créé un fichier .profile qui exécute ssh-agent (s'il n'est pas déjà en cours d'exécution) à chaque ouverture de git bash, à l'aide de ce 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

J'utilise également des extensions git, qui exécutent la commande git à partir de l'invite de commande Windows, et non pas git bash. Ainsi, ssh ne voit pas le ssh-agent en cours d'exécution. Est-il possible de réparer ça?

32
Jacko

J'ai eu le même problème que vous, alors j'ai essayé d'ajouter ce code

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

dans le fichier .bashrc de mon répertoire personnel. Et il fonctionne!

41
Fery Wardiyanto

Pour msysgit, vous devrez peut-être légèrement modifier la solution proposée par 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

Comme vous le remarquerez peut-être, le seul changement que j'ai apporté concerne l'appel ps, car msysgit n'utilise pas -U mais -u.

26
Braiam

Même si vous l'avez probablement déjà résolu, utilisez la commande eval pour rendre le processus ssh_agent conforme:

eval `ssh-agent.exe`

Ensuite, utilisez ssh-add pour ajouter les clés dont vous avez besoin.

22
Cu7l4ss

Sur Windows 10 cela a fonctionné pour moi

  1. lancer git bash
  2. touch ~/.profile
  3. start ~/.profile pour ouvrir .profile
  4. ajoutez ce qui suit à .profile
#! /bin/bash 
eval `ssh-agent -s` 
ssh-add ~/.ssh/*_rsa

Ceci est basé sur cette réponse . La seule différence est que .bashrc n'a pas fonctionné, mais que .profile a fonctionné.

10
Thoran

Vous pouvez encapsuler votre exécutable git avec un script qui source votre .profile, entraînant le chargement des variables d'environnement ssh-agent.

Placez un script appelé git dans un répertoire situé plus tôt dans votre chemin que le véritable git ou configurez les extensions git pour appeler votre wrapper à la place du véritable git.

1
Andrew Aylett

J'ai trouvé que le moyen le plus simple d'y parvenir consistait à utiliser Pageant comme agent SSH et plink.

Vous devez avoir une session PuTTY configurée pour le nom d’hôte utilisé dans votre télécommande.

Vous aurez également besoin de plink.exe, qui peut être téléchargé à partir du même site que PuTTY.

Et vous avez besoin de Pageant en cours d'exécution avec votre clé chargée. J'ai un raccourci vers pageant dans mon dossier de démarrage qui charge ma clé SSH lorsque je me connecte.

Lorsque vous installez git-scm, vous pouvez ensuite le spécifier pour qu'il utilise tortoise/plink plutôt que OpenSSH.

L’effet net est que vous pouvez ouvrir git-bash quand vous le souhaitez et pousser/tirer sans être contesté pour les mots de passe.

Il en va de même avec les sessions PuTTY et WinSCP lorsque pageant a votre clé chargée. Cela rend la vie beaucoup plus facile (et sécurisée).

1
Alasdair

Solution simple en deux chaînes de cette réponse :

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