web-dev-qa-db-fra.com

Git clone avec SSH personnalisé en utilisant l'erreur GIT_SSH

J'essaie de cloner un dépôt Git à l'aide d'une commande SSH personnalisée. J'ai défini la commande SSH dans l'environnement GIT_SSH en cours d'exécution de manière variable

export GIT_SSH="/usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key".

Mais quand, après la commande précédente, je lance

git clone [email protected]:uname/test-git-repo.git, J'obtiens l'erreur bizarre suivante

error: cannot run /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key
fatal: unable to fork

Pouvez-vous m'aider à résoudre ce problème?

54
Paris

Vous ne pouvez pas fournir d'options dans le GIT_SSH variable d'environnement; à partir de la page de manuel git:

   GIT_SSH
       If this environment variable is set then git fetch and git Push will use this command instead of ssh when they need to connect
       to a remote system. The $GIT_SSH command will be given exactly two arguments: the username@Host (or just Host) from the URL
       and the Shell command to execute on that remote system.

       To pass options to the program that you want to list in GIT_SSH you will need to wrap the program and options into a Shell
       script, then set GIT_SSH to refer to the Shell script.

Une option consiste à ajouter une strophe à votre .ssh/config fichier avec la configuration appropriée:

Host bitbucket.org
  StrictHostKeyChecking no
  IdentityFile /home/me/my_private_key

Une autre option consiste à pointer GIT_SSH à un script Shell qui fait ce que vous voulez. Par exemple, dans /home/me/bin/bitbucket_ssh, mettez:

#!/bin/sh
exec /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key "$@"

Et puis pointez GIT_SSH à /home/me/bin/bitbucket_ssh.

Je préfère utiliser .ssh/config lorsque cela est possible, car cela évite d'avoir à créer un script par destination pour chaque télécommande.

98
larsks

Notez que à partir de git 2.3+ (T1 2015), ce que vous avez essayé initialement fonctionnerait, avec la nouvelle variable d'environnement GIT_SSH_COMMAND.

Voir commit 3994276 de Thomas Quinot (quinot) :

git_connect: définir la commande Shell ssh dans GIT_SSH_COMMAND

Il peut être impossible d'installer un script wrapper pour GIT_SSH lorsque des paramètres supplémentaires doivent être passés.
Fournissez un autre moyen de spécifier une commande Shell à exécuter, y compris des arguments de ligne de commande, au moyen de GIT_SSH_COMMAND variable d'environnement, qui se comporte comme GIT_SSH mais est passé au Shell .

Le circuit spécial pour modifier les paramètres dans le cas de l'utilisation du plink/tortoiseplink de PuTTY est activé uniquement lors de l'utilisation de GIT_SSH; en cas d'utilisation de GIT_SSH_COMMAND, il est délibérément laissé à l'utilisateur de faire toute adaptation de paramètres requise avant d'appeler l'implémentation ssh sous-jacente.

GIT_SSH_COMMAND:

Si l'une de ces variables d'environnement est définie, alors 'git fetch' et 'git Push 'utilisera la commande spécifiée au lieu de' ssh 'lorsqu'ils doivent se connecter à un système distant.
La commande recevra exactement deux ou quatre arguments:

  • le 'username@Host '(ou simplement' Host ') à partir de l'URL et de la commande Shell à exécuter sur ce système distant, éventuellement précédée de' -p '(littéralement) et
  • le 'port' de l'URL quand il spécifie autre chose que le port SSH par défaut.

$GIT_SSH_COMMAND a priorité sur $GIT_SSH, et est interprétée par le shell, ce qui permet d'inclure des arguments supplémentaires.
$GIT_SSH d'autre part doit être juste le chemin vers un programme (qui peut être un script Shell wrapper, si des arguments supplémentaires sont nécessaires).

29
VonC

Utiliser ssh-agent

ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone [email protected]:uname/test-git-repo.git'
6
TlmaK0

En s'appuyant sur larsk 's answer and VonC 's answer , vous pouvez créer un git_ssh.sh script tel que:

#!/bin/sh
# Workaround: GIT_SSH_COMMAND isn't supported by Git < 2.3
exec ${GIT_SSH_COMMAND:-ssh} "$@"

Ensuite, appelez votre commande git comme ceci:

export GIT_SSH_COMMAND="/usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key"
export GIT_SSH=path/to/git_ssh.sh
git ...

Voici comment cela fonctionne:

Dans Git v2.3 + $GIT_SSH_COMMAND a priorité sur $GIT_SSH, mais les anciennes versions ne respectent pas $GIT_SSH_COMMAND du tout.

$GIT_SSH ne peut contenir qu'un chemin d'accès à la commande ssh sur le système. Il ne peut pas passer d'arguments de ligne de commande supplémentaires à cette commande, alors comment pouvons-nous passer des arguments supplémentaires à ssh?

Une solution de contournement consiste à créer un script qui inclut la commande ssh et ses arguments supplémentaires. C'est exactement ce que le git_ssh.sh c'est tout: puisque nous avons déjà défini $GIT_SSH_COMMAND être /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key, c'est exactement ce dont nous avons besoin pour exec, et le "$@" est là pour passer les arguments passés à git_ssh.sh par Git lui-même au $GIT_SSH_COMMAND.

Le ${...:-ssh} partie, bien que pas strictement nécessaire est une touche agréable qui fera $GIT_SSH_COMMAND par défaut à la commande ssh, et définissant ainsi GIT_SSH=git_ssh.sh ne cassera pas une exécution normale de git.

En tant que valeur ajoutée, ce script est totalement ignoré par Git v2.3 +, et le $GIT_SSH_COMMAND est utilisé directement dans ce cas.

6
Chen Levy

Vous pouvez fournir n'importe quel fichier clé que vous souhaitez utiliser avec la commande Git comme ceci:

$ PKEY=~/.ssh/keyfile.pem git clone [email protected]:me/repo.git

ou ca:

$ git.sh -i ~/.ssh/keyfile.pem clone [email protected]:me/repo.git

J'ai répondu à la même question ici: https://stackoverflow.com/a/1559698

Voir le lien pour plus de détails.

5
alvinabad