Especifique una clave SSH para git push para un dominio determinado
Tengo el siguiente caso de uso: me gustaría poder presionar para [email protected]:gitolite-admin
usar la clave privada de usuario gitolite-admin
, mientras quiero presionar para [email protected]:some_repo
usar 'mi propia' clave privada. 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 en ~/.ssh/config
for [email protected]
. ¿Alguien conoce alguna forma de anular la clave que se utiliza para una única git
invocación?
(Aparte: gitolite distingue quién está presionando según 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).
Incluso si el usuario y el host son los mismos, aún se pueden distinguir en ~/.ssh/config
. Por ejemplo, si su configuración se ve así:
Host gitolite-as-alice
HostName git.company.com
User git
IdentityFile /home/whoever/.ssh/id_rsa.alice
IdentitiesOnly yes
Host gitolite-as-bob
HostName git.company.com
User git
IdentityFile /home/whoever/.ssh/id_dsa.bob
IdentitiesOnly yes
Luego simplemente usas gitolite-as-alice
y gitolite-as-bob
en lugar del nombre de host en tu URL:
git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git
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 ganar"), la IdentityFile
opción se agrega a la lista de identidades para probar. Consulte: https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807
Configure su repositorio usandogit config
git config --add --local core.sshCommand 'ssh -i <<<PATH_TO_SSH_KEY>>>'
Esto se aplica únicamente a su repositorio local .
Puede utilizar la variable de entorno git GIT_SSH_COMMAND
. Ejecute esto en su terminal en su repositorio git:
GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init
Reemplace ~/.ssh/your_private_key
con la ruta de la clave privada ssh que desea usar. Y puede cambiar el comando git posterior (en el ejemplo es git submodule update --init
) por otros como git pull
, git fetch
etc.
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 de git.
Ventajas relativas al enfoque del alias de host en la otra respuesta:
- Funcionará con cualquier comando o alias de git, incluso si no puede especificarlo
remote
explícitamente. - Es más fácil trabajar con muchos repositorios porque solo necesita configurarlo una vez por máquina cliente, no una vez por repositorio en cada máquina cliente.
Utilizo algunos scripts pequeños y un alias de git admin
. De esa manera puedo hacer, por ejemplo:
git admin push
Para acceder al control remoto predeterminado utilizando la clave SSH alternativa ("admin"). Nuevamente, puedes usar cualquier comando (no solo push
) con este alias. Incluso podría git admin clone ...
clonar un repositorio al que solo tendría acceso usando su clave "admin".
Paso 1: cree las claves SSH alternativas; opcionalmente, establezca 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 determinada en lugar de la predeterminada:
#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"
Paso 3: cree un script llamado "git-as.sh" que ejecute comandos git usando la clave SSH proporcionada.
#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"
Paso 4: agregue un alias (usando algo apropiado para "PATH_TO_SCRIPTS_DIR" a continuación):
# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"
Más detalles en: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/