multiples - ssh git
Múltiples cuentas de GitHub y configuración de SSH (11)
Como complemento de la respuesta de @stefano, es mejor usar el comando con -f
cuando se genera una nueva clave SSH para otra cuenta,
ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "[email protected]"
Como el archivo id_rsa_work
no existe en la ruta ~/.ssh/
, y creo este archivo manualmente, y no funciona :(
Estoy teniendo problemas para conseguir que dos claves SSH / GitHub diferentes jueguen bien juntas. Tengo la siguiente configuración:
Repos accesibles desde una cuenta usando [email protected]:accountname
Repos accesibles 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. Aunque no creo que el archivo de configuración sea correcto. No estoy muy seguro de cómo especificar los [email protected]:accountname
a los que se accede usando [email protected]:accountname
debe usar id_rsa
y [email protected]:anotheraccount
debe usar id_rsa_anotheraccount
.
Digamos que alice
es un usuario de github.com, con 2 o más repositorios privados repoN
. Para este ejemplo trabajaremos con solo dos repositorios llamados repo1
y repo2
https://github.com/alice/repo1
https://github.com/alice/repo2
Debe extraer estos repositorios sin ingresar una contraseña probablemente en un servidor o en varios servidores. Desea realizar git pull origin master
por ejemplo, y desea que esto suceda sin pedir una contraseña.
No le gusta tratar con ssh-agent, ha descubierto (o está descubriendo ahora) acerca de ~/.ssh/config
un archivo que le permite a su cliente ssh saber qué clave privada usar, dependiendo del nombre de host y el nombre de usuario, con un Entrada de configuración simple que se ve así:
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)
, luego también fue al archivo .git/config
su repositorio y modificó la url de su origin
remoto para que sea como esto:
[remote "origin"]
url = "ssh://[email protected]/alice/repo1.git"
Finalmente, accedió a la sección Settings > Deploy keys
repositorio Settings > Deploy keys
y agregó el contenido de alice_github.id_rsa.pub
En este punto, puede hacer su git pull origin master
sin ingresar una contraseña sin problema.
pero ¿qué pasa con el segundo repositorio?
De modo que su instinto será agarrar esa clave y agregarla a las claves de implementación de repo2, pero github.com generará un error y le dirá que la clave ya está siendo utilizada.
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 así:
- par de
repo1
:(repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
- par de
repo2
:(repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)
Ahora colocará la nueva clave pública en la configuración de las claves de implementación de repo2 en github.com, pero ahora tiene un problema ssh con el que lidiar.
¿Cómo puede ssh decir qué clave usar si los repositorios están alojados en el mismo dominio github.com
?
Su archivo .ssh/config
apunta a github.com
y no sabe qué clave usar cuando es el momento de hacer el tiró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.com
y repo2.github.com
Así que lo primero es editar los archivos .git/config
en tus clones de repositorios, 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 archivo .ssh/config
, 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 git pull origin master
sin 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 aconsejo hacer el trabajo de piernas para generar 1 clave por máquina y repo. Tendrás muchas más claves que manejar, pero serás menos vulnerable si una se ve comprometida.
En mi caso, ninguna de las soluciones anteriores resolvió mi problema, pero ssh-agent sí. Básicamente, hice lo siguiente:
Genere el par de claves utilizando ssh-keygen como se muestra a continuación.
./keyfile.pub
un par de claves (en este ejemplo./keyfile
y./keyfile.pub
)ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile
Subir
keyfile.pub
al proveedor git- Inicie ssh-agent en su máquina (puede verificar con
ps -ef | grep ssh-agent
para ver si ya se está ejecutando) - Ejecute
ssh-add ./keyfile
para agregar credenciales - Ahora puede ejecutar
git clone git@provider:username/project.git
Hace poco tuve que hacer esto y tuve que analizar 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 nombré por defecto / original ''id_rsa'' (que es el predeterminado) y mi nuevo ''id_rsa-work'':
ssh-keygen -t rsa -C "[email protected]"
Paso 2: configuración ssh
Configure múltiples perfiles ssh creando / modificando ~ / .ssh / config . Tenga en cuenta los valores ''Host'' ligeramente diferentes:
# 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, haga una lista de 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 qué clave / identidad desea usar. Pero ahora debes ser bueno para irte! :)
La respuesta de Andy Lester es precisa, pero encontré un paso adicional importante que necesitaba hacer para que esto funcionara. Al intentar configurar dos perfiles, uno para personal y otro para trabajo, mi ~/.ssh/config
fue aproximadamente lo siguiente:
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 funcionó hasta que hice un ssh-add ~/.ssh/work_rsa
. Después de eso las conexiones a github utilizaron el perfil correcto. Anteriormente se establecía por defecto la primera clave pública.
No se pudo abrir una conexión con su agente de autenticación cuando se usa ssh-add
,
Compruebe: https://.com/a/17695338/1760313
Pasé mucho tiempo para entender todos los pasos. Así que vamos a describir paso a paso:
- Cree un nuevo archivo de identidad usando
ssh-keygen -t rsa
. Dale una alternativa comoproj1.id_rsa
yproj1.id_rsa
sin duda porque no necesitas una frase de contraseña. Añadir 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.com
volveremos a la sección más adelante.
- Agregue la identidad al agente
ssh-add ~/.ssh/proj1.id_rsa
- Eso es lo que me metí la primera vez; ahora, cuando desea clonar un repositorio de proj1, hágalo utilizando
proj1.github.com
(exactamente el host del archivo de configuración).git clone [email protected]
.
No te metas con los anfitriones
Solía,
Host github.com
HostName github.com
IdentityFile ~/.ssh/github_rsa
User [email protected]
Se veía bien.
Use la configuración anterior en su archivo .ssh / config para diferentes claves rsa para diferentes nombres de usuario.
Tengo 2 cuentas en github, y esto es lo que hice (en linux
) para que funcione.
Llaves
- Cree 2 pares de claves rsa, a través de
ssh-keygen
,ssh-keygen
nombre correctamente, para que sea más fácil. - Agregue 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
Establecer url remoto para repo:
- Para repo en Host
github-kc
:
git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
- Para repo en Host
github-abc
:
git remote set-url origin git@github-abc:abcdefg/yyy.git
Explicacion
Opciones en ~/.ssh/config
:
Host
github- <identify_specific_user>
El host puede ser cualquier valor que pueda identificar un host más una cuenta, no es necesario que sea un verdadero host, por ejemplo,github-kc
identifica una de mis cuentas en github para mi computadora portátil local,Cuando se configura la url remota para un repositorio de git, este es el valor para poner después de
git@
, así es como un repo se asigna a un Host, por ejemplo,git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
- [Las siguientes son sub opciones de
Host
] -
Hostname
Especifique el nombre de host real, solo usegithub.com
para github, -
User
git
el usuario es siempregit
para github, -
IdentityFile
Especifique la clave a utilizar, simplemente coloque la ruta de acceso de una clave pública, -
LogLevel
Especifique el nivel de registro para depurar, si hay algún problema,DEBUG3
proporciona la información más detallada.
Una alternativa posiblemente más simple para editar el archivo de configuración ssh (como se sugiere en todas las demás respuestas), es configurar un repositorio individual para usar una clave ssh diferente (por ejemplo, no predeterminada).
Dentro del repositorio para el que desea utilizar una clave diferente, ejecute:
git config core.sshCommand ''ssh -i ~/.ssh/id_rsa_anotheraccount''
Y asegúrese de que su clave se agregue a ssh-agent ejecutando:
ssh-add ~/.ssh/id_rsa_anotheraccount
Tenga en cuenta que el comando anterior solo agregará una clave al ssh-agent para su sesión actual. Si desea que esto funcione, debe agregarlo "permanentemente" a su agente ssh. Por ejemplo, aquí está 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 ).
Use el parámetro IdentityFile
en su ~/.ssh/config
:
Host github.com
HostName github.com
IdentityFile ~/.ssh/github.rsa
User petdance
Utilizo los scripts de shell para cambiarme a cualquier cuenta que quiera que esté "activa". Esencialmente, comienza de nuevo, obtiene una cuenta configurada correctamente y funciona, luego mueve estos archivos a un nombre con el prefijo adecuado. A partir de entonces, puede utilizar el comando "github" o "gitxyz" para cambiar:
# my github script
cd ~/.ssh
rm id_rsa
rm id_rsa.pub
rm config
ln git_dhoerl id_rsa
ln git_dhoerl.pub id_rsa.pub
ln config_dhoerl config
git config --global user.email "[email protected]"
git config --global github.user "dhoerl"
# git config --global github.token "whatever_it_is" # now unused
ssh-add -D
He tenido mucha suerte con esto. También creé un script de ejecución en Xcode (para los usuarios de Mac), por lo que no compilaría mi proyecto a menos que tuviera la configuración adecuada (ya que usa git):
Ejecutar el script colocado después de las dependencias:
#! /bin/ksh
if [ "$(git config --global --get user.email)" != "dhoerl@<company>.com" ]
then
exit 1
fi