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?
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.
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 deGIT_SSH_COMMAND
variable d'environnement, qui se comporte commeGIT_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 deGIT_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 portSSH
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).
Utiliser ssh-agent
ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone [email protected]:uname/test-git-repo.git'
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.
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.