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 entornoGIT_SSH_COMMAND
, que se comporta comoGIT_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 usarGIT_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
deusername@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 puertoSSH
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''