2011-07-14 10 views
31

Tengo 2 servidores Git que requieren 2 claves SSH diferentes.GIT seleccionar clave privada para usar

git clone [email protected]:blahblahblah usa ~/.ssh/id_rsa, pero necesito especificar qué tecla usar según el servidor al que me estoy conectando.

¿Qué parámetro de línea de comandos Git hace este trabajo? (Estoy ejecutando Linux)

+1

Esta pregunta se responde en http://superuser.com/questions/232373/tell-git-which-private-key-to-use. –

+0

posible duplicado de [Especifique una clave SSH para git push sin usar ~/.ssh/config] (http: // stackoverflow.com/questions/7927750/specify-an-ssh-key-for-git-push-without-using-ssh-config) –

+0

Posible duplicado de [Especifique la clave SSH privada para usar al ejecutar el comando del shell con o sin Ruby?] (http://stackoverflow.com/questions/4565700/specify-private-ssh-key-to-use-when-executing-shell-command-with-or-without-ruby) – Zaz

Respuesta

16

Si se está conectando a través de SSH, la clave se controlará mediante un parámetro SSH, no un parámetro git.

SSH busca en el archivo ~/.ssh/config los parámetros de configuración. Modificar ese archivo y añadir entradas IdentityFile para los dos servidores Git como este:

Host server1.whatever.com 
    IdentityFile /path/to/key_1 
Host server2.whatever.com 
    IdentityFile /path/to/key_2 

This article tiene algunos detalles más.

+3

Eso no respondió la pregunta. La pregunta es, ¿cómo le doy a git este parámetro cuando ssh maneja la autorización? – keks

+0

@Keks: Usted * no puede * pasar argumentos ssh a través de la línea de comando git. Esta respuesta proporciona una solución alternativa. También hay otras soluciones posibles, por ejemplo, https://git.wiki.kernel.org/index.php/GitTips#How_to_pass_ssh_options_in_git.3F. Tenga en cuenta que ese enfoque tampoco usa argumentos de línea de comandos para modificar el comportamiento de ssh. –

+11

Eso es cierto, sin embargo, su respuesta original no respondió la pregunta. También puede usar 'ssh-agent' y usar' ssh-add' y luego simplemente usar git. Cuando git se conecta a través de ssh, la clave ya está habilitada. Usted ve, hay varias formas, y su respuesta original simplemente no ayuda. – keks

14

Use ssh-add path-to-private-key que funciona fuera de la caja.

19

En general, desea utilizar ~/.ssh/config para esto. Simplemente emparejar las direcciones del servidor con las teclas que desea utilizar para ellos de la siguiente manera:

Host github.com 
    IdentityFile ~/.ssh/id_rsa.github 
Host heroku.com 
    IdentityFile ~/.ssh/id_rsa.heroku 
Host * 
    IdentityFile ~/.ssh/id_rsa 

Host * denota cualquier servidor, así que lo utilizan para establecer ~/.ssh/id_rsa como la clave por defecto a utilizar.

+3

Esta idea no funciona si tiene varias cuentas en un servidor como GitHub y desea una clave privada diferente para cada una. – Flimm

+0

Para cuentas múltiples en un servidor, vea esta respuesta http://stackoverflow.com/questions/3225862/multiple-github-accounts-ssh-config – lexicalscope

10

Hay otra posibilidad. Eso es para establecer core.sshCommand, p.

git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" 

Hay un escenario en particular cuando esta estrategia es particularmente útil: que es cuando tienes varias cuentas en Github, como todas las cuentas ssh a Github como [email protected] y utiliza la clave ssh para determinar qué usuario Github eres. En este caso, ni .ssh/config ni ssh-agent harán lo que usted desee.

+0

Esta debería ser la respuesta seleccionada. La configuración requerida está muy bien localizada en el repositorio que necesita usar diferentes claves ssh para acceder a diferentes servidores de git. No es necesario modificar ~/.ssh/config (e incluso/etc/hosts, en el caso de varias cuentas en el GitHub). –

+0

Sin embargo, hay un problema: no puede clonar un repositorio antes de configurarlo, y para poder configurarlo, primero debe clonarlo. O bien, podría 'git init' un repositorio, configurarlo localmente para usar el comando correcto de ssh, y luego agregar un control remoto (3 pasos, en comparación con solo 1 con" clon de git "). –

+1

Para clonar el repositorio, utilizaría la solución de @Guss, a continuación, configurando la variable de entorno GIT_SSH_COMMAND. Pero en el uso normal, prefiero mi solución, ya que evita tener que volver a exportar esa variable cada vez que inicio un nuevo shell. –

10

En mi situación, similar al escenario de @Richard Smith (cuya solución, por cierto, no funcionó), necesito usar diferentes claves para el mismo servidor en diferentes repositorios.

La solución para mí fue la creación de la sesión correctamente con la variable de entorno GIT_SSH_COMMAND, así:

export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy" 

actualización:

Otra cosa a tener en cuenta es que al establecer la variable de entorno correctamente puede ser un alboroto, entonces estoy usando las facilidades de modificación del prompt de comando provistas por cosas como Liquid Prompt of Fish Shell para engancharme al shell y seguir actualizando las variables de entorno de acuerdo con el directorio actual y algunas reglas. Por ejemplo, todos mis proyectos personales que necesitan mi clave SSH personal con Gitlab están bajo ~/Documents/Projects/personal así que cuando el gancho del shell ejecuta pwd y encuentra que el directorio actual está bajo esa ruta, establece automáticamente las variables GIT_SSH_COMMAND según sea necesario.

Cuestiones relacionadas