with remote git ssh environment-variables clone git-clone

remote - Clon de Git con SSH personalizado usando el error GIT_SSH



git clone with ssh key (5)

Estoy intentando clonar un repositorio de Git usando un comando personalizado de SSH. Configuré el comando SSH en el entorno GIT_SSH de forma variable.

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

Pero cuando, después del comando anterior corro

git clone [email protected]:uname/test-git-repo.git , me sale el siguiente error raro

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

¿Puedes ayudarme a resolver este problema?


Basándose en la answer VonC y la answer VonC , puede crear un script git_ssh.sh como:

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

Luego invoque su comando git así:

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 ...

Así es como funciona:

En Git v2.3 + $GIT_SSH_COMMAND tiene prioridad sobre $GIT_SSH , pero las versiones anteriores no respetan en absoluto $GIT_SSH_COMMAND .

$GIT_SSH solo puede contener una ruta al comando ssh en el sistema. No puede pasar argumentos de línea de comando adicionales a ese comando, entonces, ¿cómo podemos pasar argumentos adicionales a ssh ?

Una solución alternativa es crear un script que incluya el comando ssh y sus argumentos adicionales. Esto es exactamente de lo que se git_ssh.sh el git_ssh.sh : dado que ya configuramos $GIT_SSH_COMMAND para que sea /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key , es exactamente lo que necesitamos para exec , y el "$@" está aquí para pasar los argumentos pasados ​​a git_ssh.sh por Git mismo a $GIT_SSH_COMMAND.

La parte ${...:-ssh} , si bien no es estrictamente necesaria, es un buen toque que hará que $GIT_SSH_COMMAND predeterminada el comando ssh , y establecer GIT_SSH=git_ssh.sh no romperá una ejecución git normal.

Como valor agregado, Git v2.3 + omite por completo esta secuencia de comandos, y el $GIT_SSH_COMMAND se usa directamente en este caso.


No puede proporcionar opciones en la variable de entorno GIT_SSH ; de la página man de 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.

Una opción es agregar una estrofa a su archivo .ssh/config con la configuración adecuada:

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

Otra opción es señalar GIT_SSH a un script de shell que haga lo que desee. Por ejemplo, en /home/me/bin/bitbucket_ssh , pon:

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

Y luego señale GIT_SSH en /home/me/bin/bitbucket_ssh .

Prefiero usar .ssh/config cuando sea posible, ya que esto evita la necesidad de crear un script por destino para cada control remoto.


Puede proporcionar cualquier archivo de clave que desee usar con el comando Git de esta manera:

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

o esto:

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

Respondí la misma pregunta aquí: https://.com/a/15596980

Ver enlace para más detalles.


Tenga en cuenta que a partir de git 2.3+ (Q1 2015), lo que inicialmente intentó funcionar, con la nueva variable de entorno GIT_SSH_COMMAND .

Ver commit 3994276 de Thomas Quinot ( quinot ) :

git_connect : establece el comando ssh shell en GIT_SSH_COMMAND

Puede ser poco práctico instalar un script de contenedor para GIT_SSH cuando se deban pasar parámetros adicionales.
Proporcione una forma alternativa de especificar un comando de shell que se ejecutará, incluidos los argumentos de línea de comando, mediante la variable de entorno GIT_SSH_COMMAND , que se comporta como GIT_SSH pero se pasa al shell .

El circuito especial para modificar los parámetros en el caso de usar plink / tortoiseplink de PuTTY se activa solo cuando se usa GIT_SSH ; en el caso de usar GIT_SSH_COMMAND , se deja deliberadamente en manos del usuario la adaptación de los parámetros necesarios antes de llamar a la implementación ssh subyacente.

GIT_SSH_COMMAND :

Si se establece cualquiera de estas variables de entorno, '' git fetch '' y '' git push '' usarán el comando especificado en lugar de '' ssh '' cuando necesiten conectarse a un sistema remoto.
El comando recibirá exactamente dos o cuatro argumentos:

  • el '' username@host de username@host '' (o simplemente '' host '') de la URL y el comando de shell para ejecutar en ese sistema remoto, opcionalmente precedido por '' -p '' (literalmente) y
  • el '' port '' de la URL cuando especifica algo distinto al puerto SSH predeterminado.

$GIT_SSH_COMMAND tiene prioridad sobre $GIT_SSH , y el intérprete lo interpreta, lo que permite incluir argumentos adicionales.
$GIT_SSH por otro lado, debe ser solo la ruta a un programa (que puede ser un script de shell contenedor, si se necesitan argumentos adicionales).


Use ssh-agent

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