Exécution de l'agent SSH lors du démarrage de Git Bash sous Windows


152

J'utilise git bash. Je dois utiliser

eval `ssh-agent.exe`
ssh-add /my/ssh/location/

à chaque fois que je commence un nouveau git bash.

Existe-t-il un moyen de définir l'agent ssh de manière permanente? Ou Windows a-t-il un bon moyen de gérer les clés ssh?

Je suis un nouveau gars, donnez-moi s'il vous plaît un tutoriel détaillé, merci!


3
est /my/ssh/location/equalivent à quelque chose comme /c/Users/Foobar/.ssh/?
Nick

Un problème similaire a été publié sur superuser.com/q/1238486/478378 qui est maintenant résolu. L'essentiel suivant contient tous les détails gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d . Merci.
Jignesh Gohel

Réponses:


138

Lors d' une session bash git, vous pouvez ajouter un script ~/.profileou ~/.bashrc( avec ~étant généralement fixé à%USERPROFILE% ), pour ladite session pour lancer automatiquement la ssh-agent. Si le fichier n'existe pas, créez-le simplement.

C'est ce que décrit GitHub dans « Utilisation des phrases de passe de clé SSH ».

La section « Auto-launching ssh-agent on Git for Windows » de cet article contient un script robuste qui vérifie si l'agent est en cours d'exécution ou non. Vous trouverez ci-dessous juste un extrait, consultez l'article GitHub pour la solution complète.

# This is just a snippet. See the article above.
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

Autres ressources:

« Faire fonctionner ssh-agent avec git run à partir du shell de commande Windows » a un script similaire, mais je me référerais principalement à l'article GitHub ci-dessus, qui est plus robuste et à jour.


Un léger ennui que j'ai eu était que si je savais que je n'utiliserais pas git, je n'entrerais pas dans la phrase de passe de la clé ssh, puis chaque shell que j'ai ouvert l'a demandé à nouveau. Il s'agit de l'état 1, agent exécutant sans clé, vous pouvez donc supprimer ssh-add de cette section, puis si vous n'entrez pas votre phrase de passe pour la première fois, vous ne serez pas redemandé tant que vous n'aurez pas exécuté manuellement ssh-add.
Andy2K11

@Gordon Quelle partie de ce lien help.github.com/articles/working-with-ssh-key-passphrases GitHub a changé? Son contenu est toujours là, et semble toujours pertinent pour cette réponse.
VonC

1
@ Andy2K11 Si vous voulez entrer la phrase de passe la première fois que vous en avez besoin, et non lors de l'ouverture d'un shell, la manière la plus simple pour moi est de supprimer le ssh-add du .bash_profile, comme vous l'avez mentionné, et d'ajouter "AddKeysToAgent yes" à votre fichier .ssh / config (voir cette réponse: superuser.com/a/1114257/523133 ). De cette façon, vous n'avez même pas à vous souvenir de l'exécution de ssh-add.
hardsetting

30

PS: Ces instructions sont dans le contexte d'un shell Bash ouvert dans le sous-système Linux de Windows 10 et ne mentionnent pas la liaison symbolique des clés SSH générées sous Windows avec Bash sur Ubuntu sous Windows

1) Mettez à jour votre .bashrc en y ajoutant les éléments suivants

# Set up ssh-agent
SSH_ENV="$HOME/.ssh/environment"

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

# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    kill -0 $SSH_AGENT_PID 2>/dev/null || {
        start_agent
    }
else
    start_agent
fi

2) Exécutez ensuite $ source ~/.bashrcpour recharger votre configuration.

Les étapes ci-dessus ont été prises à partir de https://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch

3) Créez un fichier de configuration SSH, s'il n'est pas présent. Utilisez la commande suivante pour en créer un nouveau:.ssh$ touch config

4) Ajouter ce qui suit à ~/.ssh/config

Host github.com-<YOUR_GITHUB_USERNAME> 
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes


Host csexperimental.abc.com
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes

<More hosts and github configs can be added in similar manner mentioned above>

5) Ajoutez votre clé à l'agent SSH à l'aide de la commande $ ssh-add ~/.ssh/id_work_gmailet vous devriez pouvoir vous connecter à votre compte github ou à votre hôte distant en utilisant ssh. Par exemple, dans le contexte des exemples de code ci-dessus:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

ou

$ ssh <USER>@csexperimental.abc.com

Cet ajout de clé à l'agent SSH ne doit être effectué qu'une seule fois.

6) Déconnectez-vous maintenant de votre session Bash sur le sous-système Windows Linux, c'est-à-dire quittez à nouveau toutes les consoles Bash et redémarrez une nouvelle console et essayez de SSH sur votre hôte Github ou un autre hôte comme configuré dans le fichier de configuration SSH et cela devrait fonctionner sans avoir besoin de plus pas.

Remarque:

Merci.


1
Alternative intéressante, utilisant WSL. +1
VonC

@JigneshGohel Merci, ce script est parfait et v. Propre! Je me suis juste demandé pourquoi tu as >> "${SSH_ENV}"? Ne devrait-il pas être juste > "${SSH_ENV}"? Le vôtre fonctionne, bien sûr, mais il se termine par un ~/.ssh/environmentfichier lentement de plus en plus long , pour (comme je le pense actuellement !?) aucune raison ... Merci beaucoup! Je pense que ce script devrait simplement être inclus dans la valeur .bashrcpar défaut pour WSL Ubuntu, c'est tellement utile!
MikeBeaton

5

J'ai trouvé que le moyen le plus simple d'y parvenir était d'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 alors le spécifier pour utiliser tortoise / plink plutôt qu'OpenSSH.

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

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


2

Comme je n'aime pas utiliser putty dans Windows comme solution de contournement, j'ai créé un utilitaire très simple ssh-agent-wrapper . Il analyse vos dossiers .ssh et ajoute toutes vos clés à l'agent. Vous devez simplement le mettre dans le dossier de démarrage de Windows pour qu'il fonctionne.

Hypothèses :

  • ssh-agent dans le chemin
  • shh-add in path (à la fois en choisissant l'option "RED" lors de l'installation de git
  • les clés privées se trouvent dans le dossier% USERPROFILE% /. ssh
  • les noms de clés privées commencent par id (par exemple id_rsa)

Agréable! +1. Je travaille toujours avec openssh (pas putty), c'est donc une solution intéressante pour les clés privées avec des mots de passe.
VonC

Comme vous êtes déjà sur github, alors pourquoi ne pas simplement faire de la source un dépôt git?
Thorbjørn Ravn Andersen

Supprimez simplement les / releases du chemin. ;-)
Erez A. Korn

1

Je ne pouvais pas faire fonctionner cela sur la base de la meilleure réponse, probablement parce que je suis un tel PC et que je manque quelque chose d'évident. Mais juste pour votre information, au cas où cela aiderait quelqu'un d'aussi difficile que moi, ce qui a ENFIN fonctionné, c'est via l'un des liens ici (référencés dans les réponses). Cela impliquait simplement de coller ce qui suit dans mon .bash_profile:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

J'ai probablement quelque chose de bizarre configuré, mais je n'ai pas réussi lorsque je l'ai ajouté à mon fichier .profileou .bashrc. L'autre vrai défi que j'ai rencontré est que je ne suis pas administrateur sur cet ordinateur et que je ne peux pas modifier les variables d'environnement sans l'avoir approuvée par le service informatique, c'est donc une solution pour ceux qui ne peuvent pas y accéder.

Vous savez que cela fonctionne si vous êtes invité à entrer votre mot de passe ssh lorsque vous ouvrez git bash. Hallelujah quelque chose a finalement fonctionné.


1

Mettez ceci dans votre ~ / .bashrc (ou dans un fichier qui en est la source), ce qui l'empêchera d'être exécuté plusieurs fois inutilement par shell:

if [ -z "$SSH_AGENT_PID" ]; then
        eval `ssh-agent -s`
fi

Et puis ajoutez "AddKeysToAgent yes" à ~ / .ssh / config:

Host *
    AddKeysToAgent yes

ssh sur votre serveur (ou git pull) normalement et on ne vous demandera le mot de passe / la phrase secrète qu'une fois par session.


0

Créez un nouveau fichier .bashrc dans votre répertoire ~.

Là, vous pouvez mettre vos commandes que vous souhaitez exécuter à chaque fois que vous démarrez le bash


Cela doit fonctionner. Essayez de mettre quelque chose de simple dans un tel .bashrcfichier (comme echo testet vérifiez s'il est chargé lorsque vous exécutez Git Bash.
David Ferenczy Rogožan

Notez également que ~ dans PowerShell est probablement différent de ~ dans Git Bash / Cygwin en fonction de la version installée et des options utilisateur spécifiées.
dragon788 le

@Yar Sous Windows, mettez .bashrcdans votre dossier utilisateur par exemple C:\Users\john.
Martin van Driel

0

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

Pour sh , bash , etc:

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

Pour csh , tcsh , etc.:

# ~/.schrc
sh -c 'if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -c > ~/.ssh-agent.tcsh; fi'
eval `cat ~/.ssh-agent.tcsh`
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.