Pregunta ¿Cómo decirle a Git qué clave privada usar?


ssh tiene el -i opción para indicar qué archivo de clave privada usar al autenticar:

-i archivo_identidad

    Selecciona un archivo desde el cual   la identidad (clave privada) para la autenticación RSA o DSA se lee.   El valor predeterminado es ~/.ssh/identity para la versión de protocolo 1,   y ~/.ssh/id_rsa y ~/.ssh/id_dsa para el protocolo versión 2.   Los archivos de identidad también pueden especificarse por host   en el archivo de configuración. Es posible tener múltiples -i opciones    (y múltiples identidades especificadas en archivos de configuración).

¿Hay alguna manera similar de decir git qué archivo de clave privada usar en un sistema con múltiples claves privadas en el ~/.ssh ¿directorio?


463


origen


Ver esta pregunta en StackOverflow también. - Flimm
También relacionado serverfault.com/questions/194567/... - Machavity


Respuestas:


En ~/.ssh/config, agregue:

host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

Ahora puedes hacer git clone git@github.com:username/repo.git.

NOTA: Verifique que los permisos en IdentityFile sean 400.SSH rechazará, de una manera no claramente explícita, las claves SSH que son demasiado legibles. Simplemente se verá como un rechazo de credenciales. La solución, en este caso, es:

chmod 400 ~/.ssh/id_rsa_github

513



¿Qué sucede si necesita conectarse al mismo host con diferentes claves? - Valentin Klinghammer
@Quelltextfabrik: puede agregar otra sección con un Host diferente: nerderati.com/2011/03/... - Ben Challenor
@Cliff Nop, en mi página de manual: "HostName: Especifica el nombre de host real para iniciar sesión. Esto se puede usar para especificar apodos o abreviaturas para hosts. "Mi versión de ssh es openssh-6.7p1. - Grissiom
@Grissiom Eso es exactamente lo que dice. Pero pareces entender el significado al revés. Se requiere Host (o Match). Para crear un apodo de host, coloca el apodo en la línea Host y el nombre de host real en la línea HostName. Ejemplos: saltycrane.com/blog/2008/11/... - Cliff
Si el archivo de configuración es nuevo, no olvides hacer chmod 600 ~/.ssh/config - elysch


Variable ambiental GIT_SSH_COMMAND:

Desde la versión 2.3.0 de Git, puedes usar la variable de entorno GIT_SSH_COMMAND Me gusta esto:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

Tenga en cuenta que -i a veces puede ser anulado por su archivo de configuración, en cuyo caso, debe darle a SSH un archivo de configuración vacío, como este:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Configuración core.sshCommand:

¡Desde la versión 2.10.0 de Git, puede configurar esto por repo o globalmente, para que no tenga que establecer la variable de entorno más!

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push

214



Tuve que exportar el cáscara variable a una variable de entorno para que esto funcione, es decir export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example", entonces git clone example - Abdull
@Abdull In Bash, haciendo la asignación en la misma línea que el comando, exporta la variable de entorno solo para ese comando. Intentalo: example=hello /usr/bin/env | grep example. - Flimm
las cosas se han vuelto aún mejor: a partir de Git 2.10, puede almacenar el comando en su configuración de Git: stackoverflow.com/a/38474220/520162 - eckes
@Noitidart /dev/null es solo un nombre de archivo válido en sistemas operativos tipo UNIX, no funciona en Windows. - Flimm
Si necesita varias claves, se puede repetir el parámetro -i, y ssh probará cada tecla una por una. git config core.sshcommand "ssh -i /path/to/keyA -i /path/to/keyB". Esto permite a Git usar diferentes claves con diferentes hosts remotos. - Mark


Ahi esta no directo camino decir git qué clave privada usar, ya que depende de ssh para la autenticación del repositorio. Sin embargo, todavía hay algunas maneras de lograr su objetivo:

Opción 1: ssh-agent

Puedes usar ssh-agent para autorizar temporalmente su clave privada.

Por ejemplo:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

Opcion 2: GIT_SSH_COMMAND

Pase los argumentos ssh usando el GIT_SSH_COMMAND Variable ambiental (Git 2.3.0+).

Por ejemplo:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

Puede escribir esto todo en una sola línea: ignorar $ y omite el \.

Opción 3: GIT_SSH

Pase los argumentos ssh usando el GIT_SSH variable de entorno para especificar alternativa ssh binario.

Por ejemplo:

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

Nota: Las líneas anteriores son líneas de comandos de shell (terminal) que debe pegar en su terminal. Ellos crearán un archivo llamado ssh, hazlo ejecutable y (indirectamente) ejecútalo.

Nota: GIT_SSH está disponible desde v0.99.4 (2005).

Opción 4: ~/.ssh/config

Utilizar el ~/.ssh/config archivo como se sugiere en otras respuestas para especificar la ubicación de su clave privada, p.

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

62



//, ¿y si su identidad en ssh-agent se reenvía, como en esta pregunta? superuser.com/questions/971732/... - Nathan Basanese
Me he permitido volver a formatear esta publicación: IMO esta es, de lejos, la respuesta más completa. En su diseño original, un escaneo rápido sugirió que la publicación describiera una sola solución complicada al problema, así que me lo perdí. - Alberto
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'funcionó para mí cuando nada más lo haría. Prestigio. - Daniel Dewhurst
Tuve que usar ~/.ssh/config método, env vars no funcionó para mí ... - Greg Dubicki
GIT_SSH está disponible desde v0.99.4 (agosto de 2005), básicamente desde que existe Git (abril de 2005). - Dominik


Escribir un script que llame ssh con los argumentos que desee, y ponga el nombre de archivo del script en $GIT_SSH. O simplemente ponga su configuración en ~/.ssh/config.


32



Otra explicación de cómo hacer esto. - Sithsu
~/.ssh/config Es el camino a seguir. - hek2mgl
Trabajo en una máquina (A) desde la cual git push a un servidor (B) que solo acepta autenticación con clave ssh. Mientras que mi configuración ~ / .ssh / config en (A) funciona perfectamente bien cuando trabajo directamente en esa máquina, no cuando inicio sesión desde alguna otra ubicación (C). Utilizando $GIT_SSH y un guión resolvió este problema. ¡Gracias! - bsumirak


Si no quiere tener que especificar variables de entorno cada vez que ejecuta git, no quiere otro script de envoltura, no / no puede ejecutar ssh-agent (1), ni desea descargar otro paquete solo para esto, use el git -remote-ext (1) transporte externo:

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

Considero que esta solución es superior porque:

  • Es repositorio / específico remoto
  • Evitar la saturación de script de envoltura
  • No necesita el agente SSH; es útil si quiere clones / push / pull desatendidos (por ejemplo, en cron)
  • Definitivamente, no se necesita herramienta externa

14



//, Excelente solución. Me pregunto, sin embargo, si esto le permitiría a uno especificar una identidad pasada mediante el uso de reenvío de agente. La mayoría de mis claves no son locales para los servidores en los que las estoy usando. Pregunté sobre esto aquí: superuser.com/questions/971732/... - Nathan Basanese
La respuesta solo trata de una forma de especificar líneas de comando arbitrarias para ser usadas como repositorios git. En mi humilde opinión, deberías tratar de resolver tu problema usando ssh solo primero (por ejemplo, "ssh anfitrión"debería conectarse usando la tecla derecha). Trataré de proporcionar más información sobre su otra pregunta, sin embargo. - flaviovs
Esta respuesta fue exactamente lo que necesitaba para obligar a Chef's git recurso para usar claves de despliegue específicas del repositorio para clonar / recuperar desde repositorios privados de Github. La ventaja adicional de este método sobre los basados ​​en el entorno / script es que, dado que el key-path está codificado en la configuración del repositorio de trabajo, utilizará la misma clave tanto en el clon inicial como en las recuperaciones / impulsos posteriores. - Adam Franco
¡GUAUU! Esto es simplemente genial, no sabía de esto. Gracias por la respuesta, bastante útil también en entornos de títeres, para evitar la molestia adicional de administrar .ssh/config etc. +1! - gf_
Si encuentra el siguiente error fatal: transport 'ext' not allowed, debe incluir en la lista blanca el protocolo ext a través del export GIT_ALLOW_PROTOCOL=ext. Básicamente, el asistente remoto git-remote-ext (que admite las URL "ext :: ssh example.com% S foo / repo") permite la ejecución de comandos arbitrarios. Esto normalmente no es una preocupación porque el usuario siempre ve y confía en la URL que pasan a git. Sin embargo, los submódulos de Git, a través del archivo .gitmodules, le permiten a un atacante solicitar al cliente que busque URL de git arbitrarias. hackerone.com/reports/104465 - Gomino


Después de mi lucha con $GIT_SSH Me gustaría compartir lo que funcionó para mí.

A través de mis ejemplos asumiré que tiene su clave privada ubicada en/home/user/.ssh/jenkins

Error que se debe evitar: el valor de GIT_SSH incluye opciones

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

o lo que sea similar, fallará, como git intentará ejecutar el valor como un archivo. Por ese motivo, debe crear un script.

Ejemplo de trabajo del script $ GIT_SSH /home/user/gssh.sh

El script se invocará de la siguiente manera:

$ $GIT_SSH [username@]host [-p <port>] <command>

El funcionamiento del script de muestra podría ser similar a:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

Nota la $* al final, es parte importante de eso.

Incluso una alternativa más segura, que evitaría cualquier conflicto posible con cualquier cosa en su archivo de configuración predeterminado (además de mencionar explícitamente el puerto a usar) sería:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

Suponiendo que el script está en /home/user/gssh.sh, entonces deberás:

$ export GIT_SSH=/home/user/gssh.sh

y todo debe funcionar.


13



Gracias. Solo tenga en cuenta: use "$ @" en lugar de $ * para los argumentos pass-thru, ya que el primero se comporta correctamente cuando los argumentos contienen espacios en blanco. - Piotr Findeisen
@PiotrFindeisen Gracias por su nota. Sin embargo, no lo entiendo completamente, en zsh me ayuda a mantener cadenas con el espacio en una sola pieza, pero en bash no. ¿Puedes decirme más o señalar alguna explicación? No quiero agregar algunas modificaciones a ciegas. - Jan Vlcinsky
Debes eliminar la primera mitad de tu respuesta. Nadie está interesado en una solución que no funciona, y es una lectura desperdiciada que ofusca la respuesta correcta en la parte inferior, que funciona maravillosamente. - Cerin
@Cerin Si quiere decir eliminar el "Error para evitar", lo voy a mantener allí. Comparte trampas comunes para evitar y es muy corta. Estoy seguro de que alguien trataría de optimizar la solución al proporcionar todas las cosas en una variable (esto me pasó a mí), así que traté de acortar el camino hacia el éxito. - Jan Vlcinsky


Use la configuración de host personalizada en ~/.ssh/config, Me gusta esto:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

luego usa tu nombre de host personalizado así:

git remote add thuc git@gitlab-as-thuc:your-repo.git  

6



Esta es la respuesta que estaba buscando, ya que tengo cuentas separadas de GitHub para el hogar y el trabajo. Solo tuve que configurar Host work.github.com  HostName github.com  IdentityFile ~/.ssh/work, y luego reemplazar "github.com" por "work.github.com" cada vez que clono un repositorio de trabajo. Todavía se conecta a "github.com", pero utilizando un par de claves no predeterminadas. - Mikkel
La URL para más detalles ("itblog.study.land / ... ") no funciona más :( - Carl Smotricz