ssh
tiene la -i
opción de indicar qué archivo de clave privada usar al autenticar:
-i identity_file
Selecciona un archivo del que se lee la identidad (clave privada) para la autenticación RSA o DSA. El valor predeterminado es
~/.ssh/identity
para la versión 1 del protocolo~/.ssh/id_rsa
y~/.ssh/id_dsa
para 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-i
opciones (y múltiples identidades especificadas en los archivos de configuración).
¿Hay una manera similar de saber git
qué archivo de clave privada usar en un sistema con múltiples claves privadas en el ~/.ssh
directorio?
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/config
Variable de entorno
GIT_SSH_COMMAND
:Desde Git versión 2.3.0, puede usar la variable de entorno
GIT_SSH_COMMAND
como esta:Tenga en cuenta que a
-i
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: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 example
example=hello /usr/bin/env | grep example
./dev/null
es solo un nombre de archivo válido en sistemas operativos tipo UNIX, no funciona en Windows.GIT_SSH_COMMAND
no 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
git
qué clave privada usar, ya que dependessh
de la autenticación del repositorio. Sin embargo, todavía hay algunas maneras de lograr su objetivo:Opción 1:
ssh-agent
Puede usar
ssh-agent
para autorizar temporalmente su clave privada.Por ejemplo:
Opcion 2:
GIT_SSH_COMMAND
Pase los argumentos ssh utilizando la
GIT_SSH_COMMAND
variable de entorno (Git 2.3.0+).Por ejemplo:
Puede escribir todo esto en una línea: ignore
$
y omita el\
.Opcion 3:
GIT_SSH
Pase los argumentos ssh utilizando la
GIT_SSH
variable de entorno para especificarssh
binarios 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_SSH
está disponible desde v0.99.4 (2005).Opcion 4:
~/.ssh/config
Utilice el
~/.ssh/config
archivo 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/config
método, los embalajes no me funcionaron ...GIT_SSH
está 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
ssh
con 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/config
Es el camino a seguir.$GIT_SSH
y 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
git
recursos 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/config
etc. ¡+1!ext
transporte 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.com
HostName github.com
IdentityFile ~/.ssh/work
y 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/config
archivo. 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_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 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.sh
El 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-ssh
archivo 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.identity
valor 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-ssh
esta 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/config
y cambie los permisos a 400Agregue esto al
~/.ssh/config
archivo: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 yes
para 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/config
para 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_rsa
como la clave predeterminada para usar.fuente
Solo usa
ssh-agent
yssh-add
comandos.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
~/.ssh
directorio"?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/config
para 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_rsa
en 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
origin
y 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á presionandoorigin
puntero local debe ser "actualizado" para que coincidagitlab_as_me
(git pull origin $branch
esto 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