Tengo 2 servidores Git que requieren 2 claves SSH diferentes.
git clone user1@server1:blahblahblah
usa ~/.ssh/id_rsa
, pero necesito especificar qué clave usar dependiendo del servidor al que me estoy conectando.
¿Qué parámetro de línea de comandos de Git hace este trabajo? (Estoy ejecutando Linux).
Respuestas:
Si se conecta a través de SSH, la clave será controlada por un parámetro SSH, no un parámetro git.
SSH busca en el
~/.ssh/config
archivo los parámetros de configuración. Modifique ese archivo y agregue entradas IdentityFile para los dos servidores Git de esta manera:Este artículo tiene más detalles.
fuente
ssh-agent
y usarssh-add
y luego simplemente usar git. Cuando git se conecta a través de ssh, la clave ya está habilitada. Verá, hay varias formas, y su respuesta original simplemente no ayuda.Existe otra posibilidad. Eso es para configurar
core.sshCommand
, por ejemploHay un escenario particular en el que esta estrategia es particularmente útil: es cuando tienes varias cuentas en Github, ya que todas las cuentas están
ssh
en Github[email protected]
y usa lassh
clave para determinar qué usuario de Github eres. En este caso ni.ssh/config
nissh-agent
harás lo que quieras.Actualización : no puede ejecutar lo anterior hasta que tenga un repositorio local, por lo que si está tratando de clonar un repositorio remoto, deberá especificar la clave manualmente según la respuesta de drewbie18:
Una vez que haya clonado el repositorio, puede usar el
git config
comando para configurarlo de forma permanente.fuente
git init
un repositorio, configurarlo localmente para usar el comando ssh correcto y luego agregar un control remoto (3 pasos, en comparación con solo 1 con "git clone").Generalmente, desea usar
~/.ssh/config
para esto. Simplemente empareje las direcciones del servidor con las claves que desea usar para ellos de la siguiente manera:Host *
denota cualquier servidor, así que lo uso para establecer~/.ssh/id_rsa
como la clave predeterminada para usar.fuente
En mi escenario, similar al escenario de @Richard Smith (cuya solución, por cierto, no funcionó para mí), necesito usar diferentes claves para el mismo servidor en diferentes repositorios.
La solución para mí fue configurar la sesión correctamente con la variable de entorno
GIT_SSH_COMMAND
, así:Actualización :
Otra cosa a tener en cuenta aquí es que configurar la variable de entorno correctamente puede ser complicado, por lo que estoy usando las funciones de modificación del símbolo del sistema proporcionadas por cosas como Liquid Prompt o Fish Shell para conectarme 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 debajo,
~/Documents/Projects/personal
por lo que cuando se ejecuta el enlace de shellpwd
y encuentra que el directorio actual está debajo de esa ruta, establece automáticamente lasGIT_SSH_COMMAND
variables según sea necesario.fuente
Úselo
ssh-add path-to-private-key
funciona fuera de la caja.fuente
Puede establecer la configuración --global o --local, global actualizará el
~/.gitconfig
archivo, local actualizará la configuración en el repositorio.git/config
y anulará la configuración global (~ / .gitconfig)fuente
Usuario de Windows aquí, acabo de encontrarme con este problema y tengo una solución ligeramente diferente a la que he leído aquí hasta ahora. El problema que enfrenté es que simplemente quería clonar un repositorio usando una clave ssh privada específica y no tener que configurar globalmente mi configuración de git o agregar configuraciones específicas de git bash, ya que hago mi trabajo en PowerShell. Básicamente, solo quiero tener algunas claves privadas en mi carpeta .ssh y las hago referencia en repositorios específicos según sea necesario.
El siguiente comando funciona para esto:
Básicamente, lo que hace esto es que al inicializar el repositorio git establece la opción core.sshCommand antes de ejecutar el clon. Por lo tanto, la clave ssh específica que desea usar para este repositorio está configurada SOLAMENTE para este repositorio. Puede que esta no sea una solución ideal para todos los casos, pero para lo que quiero es.
fuente
-c
opción de hacerlogit clone
. Esto es mejor que configurar el entorno como sugiero al clonar.Las otras respuestas me inspiraron a escribir un pequeño script que elige la clave ssh dependiendo de las opciones de la línea de comandos o (si están presentes) los valores de git remote -v. ¡Espero eso ayude!
Para responder realmente a la pregunta: use gat.
Véase también https://bitbucket.org/eikerobert/gat/src/master/
#!/bin/bash usegat=false for VAR in "$@" do if [ "$VAR" != "${VAR/[email protected]:myaccount/}" ]; then usegat=true fi done if [ $usegat=false ]; then /usr/bin/git rev-parse --is-inside-work-tree >/dev/null 2>&1 isinsidegitrepo=$? #echo $isinsidegitrepo if [ $isinsidegitrepo = 0 ]; then remote=`/usr/bin/git remote -v` if [ "$remote" != "${remote/[email protected]:myaccount/}" ]; then usegat=true fi fi fi if [ $usegat = true ]; then # echo "TRUE" /usr/bin/git -c core.sshCommand="/usr/bin/ssh -i /home/myaccount/.ssh/mykey" "$@" else #echo "FALSE" /usr/bin/git "$@" fi
fuente
Otra opción es escribir un pequeño script para hacerlo
core.sshCommand
un poco más inteligente: verifique si el directorio de trabajo actual tiene una clave SSH específica configurada y, si es así, úsela; de lo contrario, confíe en la resolución de clave SSH estándar.Aquí está mi primera versión:
#!/bin/bash key="$(git config ssh.key)" if [ -n "$key" ]; then ssh -o IdentitiesOnly=yes -i "$key" "$@" else ssh "$@" fi
Luego configúrelo como el comando global git SSH:
(
~/.local/bin
es el estándar actual para "colocar scripts de usuario aquí" en los sistemas operativos SystemD )Después de configurar esto, puede configurar cualquier repositorio para usar una clave SSH específica configurando la opción de configuración
ssh.key
:Trucos opcionales adicionales
ssh.key
para tener un "respaldo predeterminado a la clave SSH no predeterminada" o algo así.core.sshCommand
en el directorio raíz del repositorio, su clientegit-ssh-command
puede ver eso y tener algunas heurísticas sobre los nombres de directorio. Esto se puede hacer en laelse
sección para que la heurística solo se active si no hay una clave específicassh.key
.git remote -v
verificación para agregar heurísticas basadas en los controles remotos, como en el script de Eikeremote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"
al comienzo del script para resolver el control remoto que se está operando, y verificarlo ($remote
se vería como la columna del medio en lagit remote -v
salida).fuente