Specifica una chiave SSH per git push per un determinato dominio

Ho il seguente caso d’uso: vorrei poter git@git.company.com:gitolite-admin a [email protected]:gitolite-admin usando la chiave privata dell’utente gitolite-admin , mentre voglio spingere a [email protected]:some_repo utilizza la chiave privata “mia”. AFAIK, non posso risolverlo usando ~/.ssh/config , perché il nome utente e il nome del server sono identici in entrambi i casi. Poiché utilizzo principalmente la mia chiave privata, ho definito in ~/.ssh/config per [email protected] . Qualcuno sa di un modo per sovrascrivere la chiave che viene utilizzata per una singola git ?

(A parte: la gitolite distingue chi sta facendo la spinta in base alla chiave, quindi non è un problema, in termini di accesso, proprietà e auditing, che la stringa user @ server sia identica per diversi utenti.)

Anche se l’utente e l’host sono gli stessi, possono ancora essere distinti in ~/.ssh/config . Ad esempio, se la tua configurazione appare così:

 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 

Quindi devi semplicemente usare gitolite-as-alice e gitolite-as-bob posto del nome host nel tuo URL:

 git remote add alice [email protected]:whatever.git git remote add bob [email protected]:whatever.git 

Nota

Si desidera includere l’opzione IdentitiesOnly yes per impedire l’utilizzo di ID predefiniti. Altrimenti, se hai anche i file id che corrispondono ai nomi predefiniti, verranno provati per primi perché a differenza di altre opzioni di configurazione (che rispettano il “primo in classifica”) l’opzione IdentityFile aggiunta all’elenco delle identity framework da provare. Vedi: https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807

Un approccio alternativo a quello proposto sopra da Mark Longair consiste nell’utilizzare un alias che eseguirà qualsiasi comando git, su qualsiasi telecomando, con una chiave SSH alternativa. L’idea è sostanzialmente quella di cambiare la tua id quadro SSH durante l’esecuzione dei comandi git.

Vantaggi relativi all’approccio alias host nell’altra risposta:

  • Funzionerà con qualsiasi comando o alias git, anche se non è ansible specificare il remote esplicitamente.
  • È più facile lavorare con molti repository perché è necessario configurarlo solo una volta per macchina client, non una volta per repository su ogni macchina client.

Io uso alcuni piccoli script e un admin git alias. In questo modo, ad esempio:

 git admin push 

Per passare al telecomando predefinito usando il tasto SSH alternativo (“admin”). Ancora, puoi usare qualsiasi comando (non solo push ) con questo alias. Potresti anche fare git admin clone ... per clonare un repository a cui avresti accesso solo usando la tua chiave “admin”.

Passo 1: crea le chiavi SSH alternative, opzionalmente imposta una passphrase nel caso tu stia facendo questo sulla macchina di qualcun altro.

Passaggio 2: creare uno script chiamato “ssh-as.sh” che esegua roba che utilizza SSH, ma utilizza una determinata chiave SSH anziché l’impostazione predefinita:

 #!/bin/bash exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "[email protected]" 

Passo 3: crea uno script chiamato “git-as.sh” che esegue comandi git usando la chiave SSH fornita.

 #!/bin/bash SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}" 

Passaggio 4: aggiungere un alias (utilizzando qualcosa di appropriato per “PATH_TO_SCRIPTS_DIR” di seguito):

 # 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" 

Maggiori dettagli su: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/

È ansible utilizzare la variabile ambientale git GIT_SSH_COMMAND . Esegui questo nel tuo terminale sotto il tuo repository git:

 GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init 

Sostituisci ~/.ssh/your_private_key con il percorso della chiave privata ssh che vuoi usare. E puoi cambiare il comando git successivo (nell’esempio è git submodule update --init ) ad altri come git pull , git fetch , ecc.

Un’altra alternativa è usare ssh-ident, per gestire le tue identity framework ssh .

Carica automaticamente e utilizza chiavi diverse in base alla directory di lavoro corrente, alle opzioni ssh e così via … il che significa che puoi facilmente avere una cartella di lavoro / directory e privata / che in modo trasparente finiscono usando chiavi e id quadro diverse con ssh.

Un sistema basato su Unix (Linux, BSD, Mac OS X), l’id quadro predefinita è memorizzata nella directory $ HOME / .ssh , in 2 file: private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub Quando si usa ssh senza l’opzione -i , utilizza la chiave privata predefinita per l’autenticazione con il sistema remoto.

Se si dispone di un’altra chiave privata che si desidera utilizzare, ad esempio $ HOME / .ssh / deploy_key , è necessario utilizzare ssh -i ~/.ssh/deploy_key ...

È noioso. Puoi aggiungere le seguenti righe al tuo $ HOME / .bash_profile : ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

Quindi, ogni volta che usi ssh o git o scp (in pratica anche ssh ), non devi più usare l’opzione -i .

Puoi aggiungere tutte le chiavi che vuoi nel file $ HOME / .bash_profile .

Sto usando Git Bash su Win7. Il seguente ha funzionato per me.

Crea un file di configurazione in ~ / .ssh / config o c: / users / [nome_utente_suoi /. Ssh / config. Nel file inserisci:

 Host your_host.com IdentityFile [absolute_path_to_your_.ssh]\id_rsa 

Immagino che l’host debba essere un URL e non solo un “nome” o un riferimento per il tuo host. Per esempio,

 Host github.com IdentityFile c:/users/[user_name]/.ssh/id_rsa 

Il percorso può anche essere scritto in / c / users / [user_name] / …. formato

Anche la soluzione fornita da Giordano Scalzo è ottima. https://stackoverflow.com/a/9149518/1738546

Se si utilizza la versione di Git di ssh su Windows, appare la riga del file di id quadro nella configurazione di ssh

 IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice 

dove /c è per c:

Per controllare, in git bash do

 cd ~/.ssh pwd 

Potrebbe essere necessario rimuovere (o commentare) la configurazione host predefinita .ssh / config