sshtiene la -iopción de indicar qué archivo de clave privada usar al autenticar:
-i identity_fileSelecciona un archivo del que se lee la identidad (clave privada) para la autenticación RSA o DSA. El valor predeterminado es
~/.ssh/identitypara la versión 1 del protocolo~/.ssh/id_rsay~/.ssh/id_dsapara la versión 2 del protocolo. Los archivos de identidad también pueden especificarse por host en el archivo de configuración. Es posible tener múltiples-iopciones (y múltiples identidades especificadas en los archivos de configuración).
¿Hay una manera similar de saber gitqué archivo de clave privada usar en un sistema con múltiples claves privadas en el ~/.sshdirectorio?
ssh
git
authentication
private-key
jrdioko
fuente
fuente

Respuestas:
En
~/.ssh/config, agregue:Ahora puedes hacerlo
git clone [email protected]: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:
fuente
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 ssh es openssh-6.7p1.chmod 600 ~/.ssh/configVariable de entorno
GIT_SSH_COMMAND:Desde Git versión 2.3.0, puede usar la variable de entorno
GIT_SSH_COMMANDcomo esta:Tenga en cuenta que a
-iveces 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:Configuración
core.sshCommand:¡Desde Git versión 2.10.0, puede configurar esto por repositorio o globalmente, por lo que ya no tiene que configurar la variable de entorno!
fuente
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example", luegogit clone exampleexample=hello /usr/bin/env | grep example./dev/nulles solo un nombre de archivo válido en sistemas operativos tipo UNIX, no funciona en Windows.GIT_SSH_COMMANDno funcionó hasta que uséIdentitiesOnly, como este comando:GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push.No hay una forma directa de saber
gitqué clave privada usar, ya que dependesshde la autenticación del repositorio. Sin embargo, todavía hay algunas maneras de lograr su objetivo:Opción 1:
ssh-agentPuede usar
ssh-agentpara autorizar temporalmente su clave privada.Por ejemplo:
Opcion 2:
GIT_SSH_COMMANDPase los argumentos ssh utilizando la
GIT_SSH_COMMANDvariable de entorno (Git 2.3.0+).Por ejemplo:
Puede escribir todo esto en una línea: ignore
$y omita el\.Opcion 3:
GIT_SSHPase los argumentos ssh utilizando la
GIT_SSHvariable de entorno para especificarsshbinarios alternativos .Por ejemplo:
Nota: Las líneas anteriores son líneas de comando de shell (terminal) que debe pegar en su terminal. Crearán un archivo llamado
ssh, lo harán ejecutable y (indirectamente) lo ejecutarán.Nota:
GIT_SSHestá disponible desde v0.99.4 (2005).Opcion 4:
~/.ssh/configUtilice el
~/.ssh/configarchivo como se sugiere en otras respuestas para especificar la ubicación de su clave privada, p. Ej.fuente
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'funcionó para mí cuando nada más lo haría. Prestigio.~/.ssh/configmétodo, los embalajes no me funcionaron ...GIT_SSHestá disponible desde v0.99.4 (agosto de 2005) , así que básicamente desde que existe Git (abril de 2005).Escriba una secuencia de comandos que llame
sshcon los argumentos que desee y coloque el nombre de archivo de la secuencia de comandos$GIT_SSH. O simplemente ponga su configuración~/.ssh/config.fuente
~/.ssh/configEs el camino a seguir.$GIT_SSHy un script resolvieron este problema. ¡Gracias!Si no desea tener que especificar variables de entorno cada vez que ejecuta git, no desea otro script de contenedor, no puede / no puede ejecutar ssh-agent (1), ni desea descargar otro paquete solo para esto, use el git -remote-ext (1) transporte externo:
Considero que esta solución es superior porque:
fuente
gitrecursos de Chef a usar claves de implementación específicas del repositorio para clonar / buscar desde repositorios privados de Github. La ventaja adicional de este método sobre los basados en el entorno / script es que, dado que la ruta de la clave está codificada en la configuración del repositorio de trabajo, utilizará la misma clave tanto en el clon inicial como en las recuperaciones / empujes posteriores..ssh/configetc. ¡+1!exttransporte en cada submódulo para que la recursividad en el padre funcione.fatal: transport 'ext' not allowed, debe incluir en la lista blanca el protocolo ext a través deexport GIT_ALLOW_PROTOCOL=ext. Básicamente, el ayudante remoto git-remote-ext (que admite URL "ext :: ssh example.com% S foo / repo") permite la ejecución arbitraria de comandos. Esto normalmente no es una preocupación porque el usuario siempre ve y confía en la URL que pasa a git. Sin embargo, los submódulos git, a través del archivo .gitmodules, permiten que un atacante solicite al cliente que busque URL arbitrarias de git. hackerone.com/reports/104465Utilice la configuración de host personalizada
~/.ssh/config, como esta:luego use su nombre de host personalizado como este:
fuente
Host work.github.comHostName github.comIdentityFile ~/.ssh/worky reemplazar "github.com" por "work.github.com" cada vez que clonaba un repositorio de trabajo. Todavía se conecta a "github.com", pero usando un par de claves no predeterminado.~/.ssh/configarchivo. En cualquier otra respuesta se pierde cómo puede configurar el host cuando agrega el origen, lo que automáticamente le permite a git usar el archivo de clave correcto. ¡¡GRACIAS!!Después de mi lucha,
$GIT_SSHme 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/jenkinsError a evitar: el valor GIT_SSH incluye opciones
o cualquier error similar, ya que git intentará ejecutar el valor como un archivo . Por esa razón, tienes que crear un script.
Ejemplo de trabajo del script $ GIT_SSH
/home/user/gssh.shEl script se invocará de la siguiente manera:
El funcionamiento del script de muestra podría verse así:
Tenga
$*en cuenta que al final, es una parte importante de la misma.Una alternativa aún más segura, que evitaría cualquier posible conflicto con cualquier cosa en su archivo de configuración predeterminado (además de mencionar explícitamente el puerto a usar) sería:
Suponiendo que el guión esté dentro
/home/user/gssh.sh, usted deberá:y todo funcionará.
fuente
Puede usar ssh-ident en lugar de crear su propio contenedor.
Puede leer más en: https://github.com/ccontavalli/ssh-ident
Carga las claves ssh a pedido cuando se necesita por primera vez, una vez, incluso con múltiples sesiones de inicio de sesión, xterms o hogares compartidos NFS.
Con un pequeño archivo de configuración, puede cargar automáticamente diferentes claves y mantenerlas separadas en diferentes agentes (para el reenvío de agentes) dependiendo de lo que necesite hacer.
fuente
Tenía un cliente que necesitaba una cuenta de github separada. Así que necesitaba usar una clave separada solo para este proyecto.
Mi solución fue agregar esto a mi .zshrc / .bashrc:
Cada vez que quiero usar git para ese proyecto, reemplazo "infogit" con git:
Para mí, es más fácil de recordar.
fuente
Así que configuré la variable GIT_SSH env en
$HOME/bin/git-ssh.Para permitir que mi configuración de repositorio dicte qué identidad ssh usar, mi
~/bin/git-ssharchivo es este:Luego tengo una configuración de configuración global de git:
Y dentro de cualquier repositorio de git, solo puedo establecer un
ssh.identityvalor de configuración de git local :Voila!
Si puede tener una dirección de correo electrónico diferente para cada identidad, se vuelve aún más simple, porque solo puede nombrar sus claves después de sus direcciones de correo electrónico y luego hacer que el usuario email de git config maneje la selección de claves de
~/bin/git-sshesta manera:fuente
Mi solución fue esta:
crear un guión:
entonces cuando tienes que cambiar la ejecución var:
¡No olvides el punto extra! esto hace que el script establezca los entornos vars !! --key y --port son opcionales.
fuente
Construyo sobre @shellholic y este hilo SO con unos cuantos tragos. Utilizo GitHub como ejemplo y supongo que tiene una clave privada
~/.ssh/github(de lo contrario, vea este hilo SO ) y que agregó la clave pública a su perfil de GitHub (de lo contrario, consulte la ayuda de GitHub ).Si es necesario, cree un nuevo archivo de configuración SSH en
~/.ssh/configy cambie los permisos a 400Agregue esto al
~/.ssh/configarchivo:Si ya tiene una configuración remota, es posible que desee eliminarla; de lo contrario, es posible que se le solicite su nombre de usuario y contraseña:
Luego agregue un control remoto al repositorio git y observe los dos puntos antes del nombre de usuario:
Y luego los comandos git funcionan normalmente, por ejemplo:
@HeyWatchThis en este hilo SO sugirió agregar
IdentitiesOnly yespara evitar el comportamiento predeterminado de SSH de enviar el archivo de identidad que coincida con el nombre de archivo predeterminado para cada protocolo. Vea ese hilo para más información y referencias.fuente
En general, desea utilizar
~/.ssh/configpara esto. Simplemente empareje las direcciones del servidor con las claves que desea utilizar para ellos de la siguiente manera:Host *denota cualquier servidor, por lo que lo uso para establecer~/.ssh/id_rsacomo la clave predeterminada para usar.fuente
Solo usa
ssh-agentyssh-addcomandos.Después de ejecutar los comandos anteriores, puede usar ambas teclas al mismo tiempo. Sólo tipo
para clonar tu repositorio.
Debe ejecutar el comando anterior después de reiniciar su máquina.
fuente
Estoy usando git versión 2.16 y no necesito una sola secuencia de comandos, ni siquiera una configuración o comandos modificados.
Y git lee la tecla automáticamente. No pregunto nada y no arroja un error. Solo funciona bien.
fuente
~/.sshdirectorio"?Si bien la pregunta no lo solicita, incluyo esta respuesta para cualquier persona que busque resolver el mismo problema específicamente para gitlab .
La solución de gitlab
Intenté usar el enfoque de variables de entorno , pero incluso la documentación de git recomienda usar
~/.ssh/configpara algo más que el caso simple. En mi caso, estoy presionando a un servidor gitlab , y quería hacerlo como un usuario específico, que por supuesto se define mediante la clave privada durante la autenticación y no el nombre de usuariogit. Una vez implementado, simplemente realizo lo siguiente:Preparar
Recordemos la ubicación de su clave privada
/myfolder/.ssh/my_gitlab_id_rsaen mi caso.Agregar una entrada en
~/.ssh/config:Agrega el git-alias en
~/.gitconfig:Como beneficio adicional, realizo mis confirmaciones en este mismo host como un usuario específico con este git-alias :
Explicación
Todo lo anterior supone que el control remoto relevante es
originy la rama relevante está actualmente desprotegida. Como referencia me encontré con varios elementos que debían abordarse:gitlab_as_me, y no me gustó ver el control remoto adicional colgando en mi árbol de registro, así que lo elimino cuando terminegitlab_as_me, debe ser específico sobre qué rama está presionandooriginpuntero local debe ser "actualizado" para que coincidagitlab_as_me(git pull origin $branchesto lo hace)fuente
Ingrese la ruta que desea guardar (Ej: my-pc / Desktop / .ssh / ed25519)
Agregue la clave pública a su gitlab ( Cómo agregar clave ssh a gitlab )
fuente