Múltiples cuentas de GitHub y configuración SSH

249

Tengo problemas para conseguir que dos claves SSH / cuentas GitHub diferentes funcionen bien juntas. Tengo la siguiente configuración:

Repos accesible desde una cuenta usando [email protected]:accountname

Repos accesible desde otra cuenta usando [email protected]:anotheraccount

Cada cuenta tiene su propia clave SSH. Se han agregado ambas claves SSH y he creado un archivo de configuración. Sin embargo, no creo que el archivo de configuración sea correcto. No estoy muy seguro de cómo especificar que los repositorios a los que se accede [email protected]:accountnamedeben usar id_rsay [email protected]:anotheraccountdeberían usar id_rsa_anotheraccount.

radesix
fuente
Encontré este enlace útil medium.freecodecamp.org/…
jgreen
Tengo 3 identidades SSH separadas en ~ / .ssh / config. El del servidor escolar tiene un código de acceso; los 2 para trabajos separados / actas personales de GitHub no. La ejecución git pullseguía fallando y solicitaba el código de acceso de la escuela, a pesar de los archivos de identidad separados, "IdentitiesOnly = yes", dominios y nombres de host separados, todos presentes en ssh-add -l... La clave uni era 'primero' independientemente de esa configuración. Tuve que mover su sección debajo de las otras en .ssh / config, y ahora git pulldesde ambos actos de GitHub tiene éxito sin pedir una contraseña uni ssh.
mc01

Respuestas:

309

La respuesta de Andy Lester es precisa, pero encontré un paso adicional importante que necesitaba hacer para que esto funcionara. Al tratar de configurar dos perfiles, uno para el personal y otro para el trabajo, mi ~/.ssh/configfue más o menos de la siguiente manera:

Host me.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/me_rsa

Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/work_rsa

Mi perfil de trabajo no tomó hasta que hice un ssh-add ~/.ssh/work_rsa. Después de eso, las conexiones a github usaron el perfil correcto. Anteriormente, por defecto, la primera clave pública.

Para No se pudo abrir una conexión con su agente de autenticación al usar ssh-add,
consulte: https://stackoverflow.com/a/17695338/1760313

Jim Wrubel
fuente
39
¡Gracias! - ssh-addEra lo que me faltaba.
sabio
Al usar ssh-add, pude ver que no tenía los permisos de archivo para la clave configurada correctamente. Una vez que arreglé eso, todo funcionó. ¡Así que gracias!
phatmann
66
Ver también doblock.com/articles/… . La nueva información clave allí es que es posible que deba agregar el nombre de usuario ("trabajo", en este ejemplo) al nombre de host en la URL remota, es decir, [email protected]: work / my_repo.git (como en oposición a "[email protected] ...")
BobS
Esto funciona: superuser.com/questions/232373/…
Casey
15
Para solucionar el problema de que "se asignaron de manera predeterminada a la primera clave pública", agréguelo IdentitiesOnly yesa la Host *sección de su ~/.ssh/configarchivo. Esto le dice a ssh que realmente use los IdentityFiles que especifique, en lugar de enviar spam al servidor con todos ellos.
Caracol mecánico
172

Recientemente tuve que hacer esto y tuve que examinar todas estas respuestas y sus comentarios para finalmente juntar la información, así que lo pondré todo aquí, en una publicación, para su conveniencia:


Paso 1: teclas ssh
Crea cualquier par de llaves que necesites. En este ejemplo, me he llamado default / original 'id_rsa' (que es el predeterminado) y mi nuevo 'id_rsa-work':

ssh-keygen -t rsa -C "[email protected]"


Paso 2: ssh config
Configure múltiples perfiles ssh creando / modificando ~ / .ssh / config . Tenga en cuenta los valores ligeramente diferentes de 'Host':

# Default GitHub
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

# Work GitHub
Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_work


Paso 3: ssh-add
Puede o no tener que hacer esto. Para verificar, enumere las huellas digitales de identidad ejecutando:

$ ssh-add -l
2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA)
2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f [email protected] (RSA)

Si sus entradas no están allí, ejecute:

ssh-add ~/.ssh/id_rsa_work


Paso 4: prueba
Para probar que has hecho todo esto correctamente, sugiero la siguiente comprobación rápida:

$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

Tenga en cuenta que tendrá que cambiar el nombre de host (github / work.github) dependiendo de la clave / identidad que le gustaría usar. ¡Pero ahora deberías estar listo! :)

stefano
fuente
1
Esta es una gran respuesta. Tuve que usar ssh-add para agregar ambas claves ssh para utilizar el archivo de configuración ... Gracias :)
gaurav.singharoy
Lo único que me gusta agregar es que cuando ejecutas ssh-keygen -t rsa, te dará un nombre de archivo predeterminado, ahí es donde ingresas tu nombre de archivo personalizado.
Donato
Una de las mejores respuestas. También este video me ayudó. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif
Buena publicación, sería bueno si esta publicación incluyera la configuración de su 'correo electrónico' de configuración de git: help.github.com/articles/…
Dave Engineer
43

Digamos que alicees un usuario de github.com, con 2 o más repositorios privados repoN. Para este ejemplo, trabajaremos con solo dos repositorios nombrados repo1yrepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Debe extraerse de estos repositorios sin ingresar una contraseña probablemente en un servidor o en varios servidores. Desea realizar, git pull origin masterpor ejemplo, y desea que esto suceda sin solicitar una contraseña.

No le gusta tratar con ssh-agent, ha descubierto (o lo está descubriendo ahora) sobre ~/.ssh/configun archivo que le permite a su cliente ssh saber qué clave privada usar según el nombre de host y el nombre de usuario, con una entrada de configuración simple que se parece esta:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

Así que siguió adelante y creó su (alice_github.id_rsa, alice_github.id_rsa.pub)par de claves, luego también fue al .git/configarchivo de su repositorio y modificó la URL de su control remoto originpara que sea algo así:

[remote "origin"]
        url = "ssh://[email protected]/alice/repo1.git"

Y finalmente fuiste a la Settings > Deploy keyssección de repositorio y agregaste el contenido dealice_github.id_rsa.pub

En este punto, puede hacerlo git pull origin mastersin ingresar una contraseña sin problemas.

pero ¿qué pasa con el segundo repositorio?

Por lo tanto, su instinto será tomar esa clave y agregarla a repo2las claves de implementación, pero github.com generará un error y le dirá que la clave ya se está utilizando.

Ahora ve y genera otra clave (usando ssh-keygen -t rsa -C "[email protected]"sin contraseñas, por supuesto), y para que esto no se convierta en un desastre, ahora nombrarás tus claves de esta manera:

  • repo1 Par de claves: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 Par de claves: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Ahora colocará la nueva clave pública en repo2la configuración de implementación de claves en github.com, pero ahora tiene que resolver un problema de ssh.

¿Cómo puede saber ssh qué clave usar si los repositorios están alojados en el mismo github.comdominio?

Su .ssh/configarchivo apunta github.comy no sabe qué tecla usar cuando es el momento de hacer la extracción.

Así que encontré un truco con github.com. Puede decirle a su cliente ssh que cada repositorio vive en un subdominio github.com diferente, en estos casos, serán repo1.github.comyrepo2.github.com

Entonces, lo primero es editar los .git/configarchivos en sus clones de repositorio, para que se vean así:

Para repo1

[remote "origin"]
        url = "ssh://[email protected]/alice/repo1.git"

Para repo2

[remote "origin"]
        url = "ssh://[email protected]/alice/repo2.git"

Y luego, en su .ssh/configarchivo, ahora podrá ingresar una configuración para cada subdominio :)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

Ahora puede hacerlo git pull origin mastersin ingresar ninguna contraseña de ambos repositorios.

Si tiene varias máquinas, puede copiar las claves en cada una de las máquinas y reutilizarlas, pero le aconsejaría hacer el trabajo de pierna para generar 1 clave por máquina y repositorio. Tendrás muchas más claves que manejar, pero serás menos vulnerable si una se ve comprometida.

Gubatron
fuente
1
Especificar el subdominio que coincide con el host .ssh/configes el paso crucial, muchas gracias por eso
Mike Miller,
22

Tengo 2 cuentas en github, y esto es lo que hice (en linux) para que funcione.

Llaves

  • Cree 2 pares de claves rsa, vía ssh-keygen, asígneles un nombre adecuado, para que la vida sea más fácil.
  • Agregar claves privadas al agente local a través de ssh-add path_to_private_key
  • Para cada cuenta de github, cargue una clave pública (distinta).

Configuración

~ / .ssh / config

Host github-kc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_kc.pub
    # LogLevel DEBUG3

Host github-abc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_abc.pub
    # LogLevel DEBUG3

Establezca la URL remota para el repositorio:

  • Para el repositorio en el host github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • Para el repositorio en el host github-abc:

    git remote set-url origin git@github-abc:abcdefg/yyy.git
    

Explicación

Opciones en ~/.ssh/config:

  • Hostgithub- <identify_specific_user>
    Host podría ser cualquier valor que pudiera identificar un host más una cuenta, no necesita ser un host real, por ejemplo, github-kcidentificar una de mi cuenta en github para mi computadora portátil local,

    Cuando se configura la URL remota para un repositorio git, este es el valor que se debe poner después git@, así es como un repositorio se asigna a un Host, por ejemplogit remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [Las siguientes son opciones secundarias de Host]
  • Hostname
    especifique el nombre de host real, solo use github.compara github,
  • Usergit
    el usuario es siempre gitpara github,
  • IdentityFile
    especifique la clave a usar, simplemente ponga la ruta de la clave pública,
  • LogLevel
    especifique el nivel de registro para depurar, si hay algún problema, DEBUG3proporciona la información más detallada.

Eric Wang
fuente
encantador, no lo necesitaba ssh-add path_to_private_key, probablemente porque no se requiere el agente en este caso. El archivo de configuración está definiendo explícitamente la ruta a las claves.
Mark Chackerian
2
@ MarkChackerian Creo que no necesita ssh-addporque sus claves no están protegidas con contraseña o (si está en una Mac) el llavero OSX lo está manejando por usted. ssh-addevita que necesite ingresar la frase de contraseña cada vez que accede a sus claves.
Ashhar Hasan
18

Use el IdentityFileparámetro en su ~/.ssh/config:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance
Andy Lester
fuente
Gracias pero esto no es del todo exacto. Encontré la respuesta y la compartí a continuación.
radesix
Estoy bastante seguro de que mi enfoque funcionará en su caso. Puede identificar diferentes usuarios y diferentes archivos de identidad. Solo necesita dar a cada uno un parámetro Host diferente en la sección de configuración.
Andy Lester
1
Andy, de acuerdo con el enlace que encontré a continuación, necesitaba quitar el .com del host. Una vez que hice eso funcionó bien.
radesix
5

Una alternativa posiblemente más simple para editar el archivo de configuración ssh (como se sugiere en todas las otras respuestas), es configurar un repositorio individual para usar una clave ssh diferente (por ejemplo, no predeterminada).

Dentro del repositorio para el que desea usar una clave diferente, ejecute:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'

Y asegúrese de que su clave se agregue al agente ssh ejecutando:

ssh-add ~/.ssh/id_rsa_anotheraccount

Tenga en cuenta que el comando anterior solo agregará la clave al agente ssh para su sesión actual. Si desea que esto funcione para siempre, debe agregarlo "permanentemente" a su agente ssh. Por ejemplo, aquí se explica cómo hacerlo para ubuntu y aquí para OSX .

También debería ser posible escalar este enfoque a múltiples repositorios utilizando la configuración global de git y las inclusiones condicionales ( ver ejemplo ).

Jakub Kukul
fuente
4

En mi caso, ninguna de las soluciones anteriores resolvió mi problema, pero ssh-agent sí. Básicamente, hice lo siguiente:

  1. Genere el par de claves usando ssh-keygen que se muestra a continuación. Generará un par de claves (en este ejemplo .\keyfiley .\keyfile.pub)

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

  2. Subir keyfile.pubal proveedor git

  3. Inicie ssh-agent en su máquina (puede verificar ps -ef | grep ssh-agentsi ya se está ejecutando)
  4. Ejecutar ssh-add .\keyfilepara agregar credenciales
  5. Ahora puedes correr git clone git@provider:username/project.git
berniey
fuente
4

Pasé mucho tiempo para comprender todos los pasos. Así que describamos paso a paso:

  1. Crea un nuevo archivo de identidad usando ssh-keygen -t rsa. Dale una alternativa como proj1.id_rsay golpea sin duda porque no necesitas una frase de contraseña.
  2. Agregar nueva sección en .ssh/config:

    Host proj1.github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/proj1.id_rsa
    

Tenga en cuenta la primera sección y tenga en cuenta que proj1.github.comvolveremos a la sección más adelante.

  1. Agregar la identidad al agente ssh ssh-add ~/.ssh/proj1.id_rsa
  2. Eso es lo que ensucié la primera vez, ahora cuando quieres clonar un repositorio proj1 lo haces usando proj1.github.com(exactamente el host del archivo de configuración). git clone [email protected].

Un buen tutorial

No te metas con los anfitriones

I159
fuente
¡Gracias por el enlace al turorial! Tienes un error tipográfico: los nombres de las claves id_rsa_proj1y en proj1_id_rsarealidad deberían ser los mismos. También puede agregar la parte sobre la .git/configconfiguración del tutorial a su respuesta.
cezar
Todavía tienes un error tipográfico: proj1.id_rsavs.proj1_id_rsa
cezar
2

Solía,

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User [email protected]

Funcionó bien.

Use la configuración anterior en su archivo .ssh / config para diferentes claves rsa para diferentes nombres de usuario.

Jyoti Prakash
fuente
2

Como complemento de la respuesta de @stefano, es mejor usar el comando -fcuando genere una nueva clave SSH para otra cuenta,

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "[email protected]"

Como el id_rsa_workarchivo no existe en la ruta ~/.ssh/, y creo este archivo manualmente, y no funciona :(

li2
fuente
2

Publiqué la técnica que uso para tratar con esto aquí

David H
fuente