Tengo el siguiente caso de uso: me gustaría poder [email protected]:gitolite-admin
usar la clave privada del usuario gitolite-admin
, mientras quiero usar la clave privada [email protected]:some_repo
'mi propia'. AFAIK, no puedo resolver esto usando ~/.ssh/config
, porque el nombre de usuario y el nombre del servidor son idénticos en ambos casos. Como uso principalmente mi propia clave privada, la tengo definida ~/.ssh/config
para [email protected]
. ¿Alguien sabe de una manera de anular la clave que se utiliza para una sola git
invocación?
(Aparte: gitolite distingue quién está presionando en función de la clave, por lo que no es un problema, en términos de acceso, propiedad y auditoría, que la cadena usuario @ servidor sea idéntica para diferentes usuarios).
Respuestas:
Incluso si el usuario y el host son iguales, aún se pueden distinguir
~/.ssh/config
. Por ejemplo, si su configuración se ve así:Luego solo usa
gitolite-as-alice
y engitolite-as-bob
lugar del nombre de host en su URL:Nota
Desea incluir la opción
IdentitiesOnly yes
para evitar el uso de identificadores predeterminados. De lo contrario, si también tiene archivos de identificación que coinciden con los nombres predeterminados, se probarán primero porque, a diferencia de otras opciones de configuración (que cumplen con "primero en victorias"), laIdentityFile
opción se agrega a la lista de identidades para probar. Ver: /server/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807fuente
git@
parte en el control remoto no es necesaria, ya que se proporciona en laUser
línea de la configuración.IdentitiesOnly yes
inmediatamente después de la línea conIdentityFile
el host. Parece que estaba transmitiendo múltiples identidades y una de ellas tenía bloqueado el acceso al host.Un enfoque alternativo al ofrecido anteriormente por Mark Longair es usar un alias que ejecute cualquier comando git, en cualquier control remoto, con una clave SSH alternativa. La idea es básicamente cambiar su identidad SSH al ejecutar los comandos git.
Ventajas relativas al enfoque de alias de host en la otra respuesta:
remote
explícitamente.Yo uso algunos pequeños guiones y un alias git
admin
. De esa manera puedo hacer, por ejemplo:Para pasar al control remoto predeterminado con la tecla SSH alternativa ("admin"). De nuevo, puede usar cualquier comando (no solo
push
) con este alias. Incluso podría hacergit admin clone ...
para clonar un repositorio al que solo tendría acceso utilizando su clave "admin".Paso 1: Cree las claves SSH alternativas, opcionalmente configure una frase de contraseña en caso de que esté haciendo esto en la máquina de otra persona.
Paso 2: Cree un script llamado "ssh-as.sh" que ejecute cosas que usen SSH, pero use una clave SSH dada en lugar de la predeterminada:
Paso 3: Cree un script llamado "git-as.sh" que ejecute comandos git usando la clave SSH dada.
Paso 4: Agregue un alias (usando algo apropiado para "PATH_TO_SCRIPTS_DIR" a continuación):
Más detalles en: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/
fuente
$@
->"$@"
para estar seguro.Puede utilizar la variable de entorno git
GIT_SSH_COMMAND
. Ejecute esto en su terminal debajo de su repositorio git:Reemplace
~/.ssh/your_private_key
con la ruta de la clave privada ssh que desea usar. Y se puede cambiar el comando git posterior (en el ejemplo esgit submodule update --init
) a otros les gustagit pull
,git fetch
etc.fuente
En sistemas basados en Unix (Linux, BSD, Mac OS X), la identidad predeterminada se almacena en el directorio $ HOME / .ssh , en 2 archivos:
private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub
cuando se usassh
sin opción-i
, usa la clave privada predeterminada para autenticarse con el sistema remoto.Si tiene otra clave privada que desea usar, por ejemplo $ HOME / .ssh / deploy_key , debe usar
ssh -i ~/.ssh/deploy_key ...
Esto es molesto. Puede agregar las siguientes líneas en su $ HOME / .bash_profile :
ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa
Entonces, cada vez que usa
ssh
ogit
oscp
(básicamentessh
también), ya no tiene que usar la opción-i
.Puede agregar tantas claves como desee en el archivo $ HOME / .bash_profile .
fuente
Otra alternativa es usar ssh-ident, para administrar sus identidades ssh .
Se carga automáticamente y utiliza diferentes claves en función de su directorio de trabajo actual, las opciones de ssh, etc., lo que significa que puede tener fácilmente un directorio de trabajo / privado y un directorio que terminan de forma transparente usando diferentes claves e identidades con ssh.
fuente
Estoy usando Git Bash en Win7. Lo siguiente funcionó para mí.
Cree un archivo de configuración en ~ / .ssh / config o c: / users / [your_user_name] /. Ssh / config. En el archivo ingrese:
Supongo que el host debe ser una URL y no solo un "nombre" o referencia para su host. Por ejemplo,
La ruta también se puede escribir en formato / c / users / [user_name] / ....
La solución proporcionada por Giordano Scalzo también es genial. https://stackoverflow.com/a/9149518/1738546
fuente
Desde git 2.10 en adelante también es posible usar la configuración gitconfig sshCommand. Docs estado :
Un ejemplo de uso sería:
git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]
En algunos casos, esto no funciona porque ssh_config anula el comando, en este caso intente
ssh -i ~/.ssh/[insert_your_keyname] -F /dev/null
no usar ssh_config.fuente
Combiné y probé con github el siguiente enfoque, basado en la lectura de otras respuestas, que combina algunas técnicas:
La ventaja de este enfoque es que, una vez configurado, no requiere ningún trabajo adicional para hacerlo bien; por ejemplo, no es necesario cambiar las URL remotas o recordar clonar cosas de manera diferente: la reescritura de URL hace que todo funcione .
~/.ssh/config
~/.gitconfig
~/dev/work/.gitconfig
Siempre y cuando mantenga todos sus repositorios de trabajo en ~ / dev / work y cosas personales en otro lugar, git usará la clave SSH correcta al hacer pulls / clones / push al servidor, y también adjuntará la dirección de correo electrónico correcta a todos tus compromisos
Referencias
1
2
fuente
includeIf
¿Debería funcionar solo si hay un.git
directorio presente, pensé?Si usa la versión de ssh de Git en Windows, la línea del archivo de identidad en la configuración de ssh se ve así
para donde
/c
esc:
Para comprobar, en git's bash do
fuente
Es posible que deba eliminar (o comentar) la configuración de host predeterminada
fuente
más especificado en la clave de configuración de archivo ssh:
fuente
Como alguien más mencionó,
core.sshCommand
config se puede usar para anular la clave SSH y otros parámetros.Aquí hay un ejemplo donde tiene una clave alternativa nombrada
~/.ssh/workrsa
y desea usarla para todos los repositorios clonados debajo~/work
..gitconfig
archivo en~/work
:~/.gitconfig
, agregue:fuente
Una posibilidad de usar
~/.ssh/config
es usar laMatch
restricción en lugar de laHost
restricción. En particular,Match Exec
llama a un comando de shell para decidir si aplica las declaraciones o no. En bash puedes usar el siguiente comando:Esto usa el
[
comando bash para verificar si dos cadenas son iguales. En este caso, está probando si la cadena[email protected]:gitolite-admin
coincide con la salida que se obtiene del$(git config --get remote.origin.url)''
comando.Puede usar cualquier otro comando que identifique el repositorio en el que se encuentra el shell. Para que esto funcione es importante tener la
$SHELL
variable definida en su shell, en mi caso/bin/bash
. El ejemplo completo sería el siguiente~/.ssh/config
:En este ejemplo supuse que
~/.ssh/yourOwnPrivateKey
contiene su propia clave privada y que~/.ssh/gitolite-admin
contiene la clave privada del usuariogitolite-admin
. Incluí laIdentitiesOnly yes
declaración para asegurarme de que solo se ofrezca una clave al servidor git, mencionada por Mark Longair . Las otras declaraciones son solo opciones ssh estándar para git.Puede agregar esta configuración si tiene varias
some_repo
que desea usar con diferentes claves. Si tiene varios repositorios[email protected]
y la mayoría de ellos los usa~/.ssh/yourOwnPrivateKey
, tiene más sentido incluir esta clave como predeterminada para el host. En este caso el~/.ssh/config
sería:Tenga en cuenta que el orden importa y la
Host git.company.com
restricción debe aparecer después delMatch Exec
uno o los unos.fuente
Configure su repositorio usando
git config
. Por ejemplo:fuente