Pasando opciones ssh a git clone

103

Estoy tratando de ejecutar git clonesin que ssh verifique la clave del host del repositorio. Puedo hacerlo desde ssh así:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@host

¿Hay alguna forma de pasar las mismas opciones ssh al comando git clone?

Editar: hay una restricción que no puedo modificar ~/.ssh/configni ningún otro archivo en esa máquina.

Daniel
fuente
2
Lo que intenta hacer es muy arriesgado y probablemente no debería hacerlo. Deshabilitar la verificación si la identidad del servidor SSH remoto es una mala idea en la mayoría de las situaciones. Inhabilita de manera efectiva toda la seguridad obtenida mediante el uso de SSH y se abre a ataques de intermediarios.
aef
1
En realidad, esto es a menudo exactamente lo que quieres hacer. Tienes un repositorio interno. Si alguien ha logrado falsificar eso, entonces estás en problemas. No es "muy arriesgado" en absoluto. De hecho, ¿con qué frecuencia realiza una verificación fuera de banda de la clave de host? (Debeis).
Graham Nicholls

Respuestas:

47

Agréguelos a su ~/.ssh/config:

Host host
    HostName host
    User user
    SshOption1 Value1
    SshOption2 Value2

La Hostentrada es lo que especificará en la línea de comando y HostNamees el verdadero nombre de host. Pueden ser iguales o la Hostentrada puede ser un alias. La Userentrada se utiliza si no la especifica user@en la línea de comando.

Si debe configurar esto en la línea de comando, configure la GIT_SSHvariable de entorno para que apunte a un script con sus opciones en él.

Josh Lee
fuente
4
Olvidé decir que no puedo modificar ningún archivo en esa máquina. De lo contrario, sí, su solución funcionaría.
Daniel
28
Utilice la GIT_SSHvariable de entorno.
Josh Lee
151

El git 2.3 lanzado recientemente admite una nueva variable "GIT_SSH_COMMAND" que se puede usar para definir un comando CON parámetros.

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@host

$GIT_SSH_COMMANDtiene prioridad $GIT_SSHy es interpretado por el shell, lo que permite incluir argumentos adicionales.

Boris
fuente
¿Debería haber una nueva línea antes git cloneo el código es correcto?
Tomáš Zato - Reincorpora a Monica
7
Esto debería ser correcto, sin la nueva línea, la variable debería establecerse para el siguiente comando. Si agrega una nueva línea, necesitaría exportar la variable, entonces también debería funcionar.
Boris
Gracias, he estado estancado en esto durante 2 días.
James Gentes
¡Booya! Gracias.
Jasper Blues
creo que no funcionará con la versión de git 1.9, ¿hay alguna solución alternativa para git 1.9?
lazarus
33

Otra opción hecha para especificar diferentes claves es git config core.sshCommandcon git 2.10 + (Q3 2016).

Esta es una alternativa a la variable de entorno descrita en la respuesta de Boris )

Véase la confirmación 3c8ede3 (26 de junio de 2016) de Nguyễn Thái Ngọc Duy ( pclouds) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso dc21164 , 19 de julio de 2016)

Se core.sshCommandha agregado una nueva variable de configuración para especificar qué valor debe usar GIT_SSH_COMMAND por repositorio.

Similar a $GIT_ASKPASSo $GIT_PROXY_COMMAND, también leemos del archivo de configuración primero y luego volvemos a$GIT_SSH_COMMAND .

Esto es útil para seleccionar diferentes claves privadas dirigidas al mismo host (por ejemplo, github)

core.sshCommand:

Si esta variable está configurada, git fetchy git pushusará el comando especificado en lugar de sshcuando necesiten conectarse a un sistema remoto.
El comando tiene el mismo formato que la GIT_SSH_COMMANDvariable de entorno y se anula cuando se establece la variable de entorno.

Significa que git clonepuede ser:

cd /path/to/my/repo
git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' 
# later on
git clone host:repo.git

Si desea aplicar eso para todos los repositorios , como agrega el usuario 1300959 en los comentarios , usaría una configuración global.

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
VonC
fuente
2
Lo más probable es que aún no tenga un repositorio, ya que lo tiene git clone; en este caso, es posible que desee configurar el comando git ssh de forma global:git config --global core.sshCommand ...
iurii
@ user1300959 Buen punto, gracias. He incluido su comentario en la respuesta para mayor visibilidad.
VonC
Esta es la mejor respuesta.
MikeSchinkel
En la última parte le falta apóstrofe
Luigi Lopez
@LuigiLopez ¿Puedes editar la respuesta? Revisaré tu edición.
VonC
21

Aquí hay un ejemplo complicado de cómo pasar los argumentos ssh utilizando la variable GIT_SSH:

$ echo 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH="$PWD/ssh" git clone user@host

Nota: Las líneas anteriores son líneas de comandos de terminal que debe pegar en su terminal. Creará un archivo ssh , lo hará ejecutable y lo ejecutará.

Si desea pasar la opción de clave privada, consulte ¿Cómo decirle a git qué clave privada usar? .

Kenorb
fuente
¡Agradable! Pregunta: Ambos $*y "$@"parecen funcionar. Normalmente lo uso "$@", ya que el otro parece obsoleto. ¿Hay alguna razón para preferir $*en este caso?
mh8020
16

Configuración del nivel de repositorio sin afectar la configuración del nivel del sistema

Consolidando las respuestas ya disponibles, elijo los pasos a continuación. Esto asegura que los cambios de configuración no impacten a nivel de máquina, sino solo para el repositorio en el que se está trabajando. Esto es necesario en mi caso, ya que mi script debe ejecutarse en un agente Bamboo compartido.

1.Clone el repositorio adoptando el GIT_SSH_COMMANDenfoque.

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone ssh://url

2.Una vez clonado, navegue al directorio del repositorio.

cd repo-dir

3.Establezca la core.sshCommandconfiguración para que todas las llamadas futuras se puedan ejecutar con los comandos git como de costumbre, pero consumiendo internamente las opciones de git proporcionadas.

git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
Pavan Kumar
fuente
1
Buen uso de lo core.sshCommandque mencioné anteriormente. Voto a favor.
VonC
5

Creo que actualizar git a una versión> = 2.3 y usar GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@hostes la opción de apuesta, pero si no es posible, @ josh-lee dio una buena opción, pero por favor, actualice su respuesta sangrando el archivo de configuración ssh.

Host host
    HostName host
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
Jonathan Beber
fuente
0

Este problema se ha solucionado siguiendo los pasos en la máquina de Windows: -

  • Cree un archivo de configuración en la carpeta C: \ Users \ username.ssh.

  • agregue la siguiente línea a un archivo de configuración.

    host <HOST>
    hostname <HOSTNAME>
    user <USER_NAME>
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    port <PORT_NUMBER>
    KexAlgorithms +diffie-hellman-group1-sha1
    
  • vuelva a intentarlo.

Ajay Kumar
fuente