Più account GitHub e configurazione SSH

Sto avendo qualche problema a ottenere due chiavi SSH / account GitHub diversi per giocare bene insieme. Ho la seguente configurazione:

Repos accessibili da un account utilizzando [email protected]github.com:accountname

Repos accessibili da un altro account utilizzando [email protected]:anotheraccount

Ogni account ha la sua chiave SSH. Entrambe le chiavi SSH sono state aggiunte e ho creato un file di configurazione. Non credo però che il file di configurazione sia corretto. Non sono abbastanza sicuro su come specificare il [email protected]:accountname accessibile tramite [email protected]:accountname dovrebbe usare id_rsa e [email protected]:anotheraccount dovrebbe usare id_rsa_anotheraccount .

La risposta di Andy Lester è accurata, ma ho trovato un passo in più importante che dovevo fare per farlo funzionare. Nel tentativo di ottenere due profili impostati, uno per personale e uno per lavoro, il mio ~/.ssh/config era approssimativamente il seguente:

 Host me.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/me_rsa Host work.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/work_rsa 

Il mio profilo di lavoro non ha preso fino a quando ho fatto un ssh-add ~/.ssh/work_rsa . Dopo che le connessioni a Github hanno usato il profilo corretto. Precedentemente, per impostazione predefinita sono state aggiunte alla prima chiave pubblica.

Per Could non aprire una connessione al tuo agente di autenticazione quando si usa ssh-add ,
controllare: https://stackoverflow.com/a/17695338/1760313

Di recente ho dovuto fare questo e ho dovuto vagliare tutte queste risposte e i loro commenti per finire a unire le informazioni, quindi metterò tutto qui, in un solo post, per vostra comodità:

Passaggio 1: chiavi ssh
Crea qualsiasi coppia di chiavi che ti servirà. In questo esempio mi sono assegnato il nome predefinito / originale ‘id_rsa’ (che è l’impostazione predefinita) e il mio nuovo ‘id_rsa-work’:

 ssh-keygen -t rsa -C "[email protected]" 

Passaggio 2: ssh config
Impostare più profili ssh creando / modificando ~ / .ssh / config . Nota i valori “Host” leggermente diversi:

 # Default GitHub Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa # Work GitHub Host work.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_work 

Passaggio 3: ssh-add
Si può o non si deve fare questo. Per controllare, elencare le impronte digitali di id quadro eseguendo:

 $ ssh-add -l 2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA) 2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f [email protected] (RSA) 

Se le tue voci non sono presenti, esegui:

 ssh-add ~/.ssh/id_rsa_work 

Passaggio 4: test
Per verificare se hai fatto tutto correttamente, suggerisco il seguente controllo rapido:

 $ ssh -T [email protected] Hi stefano! You've successfully authenticated, but GitHub does not provide shell access. $ ssh -T [email protected] Hi stefano! You've successfully authenticated, but GitHub does not provide shell access. 

Tieni presente che dovrai modificare il nome host (github / work.github) a seconda della chiave / id quadro che desideri utilizzare. Ma ora dovresti essere bravo! 🙂

Diciamo che alice è un utente di github.com, con 2 o più repository repoN . Per questo esempio lavoreremo con solo due repository chiamati repo1 e repo2

https://github.com/alice/repo1

https://github.com/alice/repo2

È necessario essere da estrarre da questi repository senza immettere una password probabilmente su un server o su più server. Ad esempio, si desidera eseguire il git pull origin master e si desidera che ciò avvenga senza chiedere una password.

Non ti piace avere a che fare con ssh-agent, hai scoperto (o stai scoprendo ora) su ~/.ssh/config un file che consente al tuo client ssh di sapere quale chiave privata usare a seconda del nome host e del nome utente, con un semplice voce di configurazione simile a questa:

 Host github.com HostName github.com User git IdentityFile /home/alice/.ssh/alice_github.id_rsa IdentitiesOnly yes 

Quindi sei andato avanti e hai creato la tua (alice_github.id_rsa, alice_github.id_rsa.pub) coppia di chiavi, poi sei anche andato al file .git/config tuo repository e hai modificato l’url origin remota in modo che fosse qualcosa del genere:

 [remote "origin"] url = "ssh://[email protected]/alice/repo1.git" 

E infine sei entrato nel repository Settings > Deploy keys section e alice_github.id_rsa.pub aggiunto il contenuto di alice_github.id_rsa.pub

A questo punto è ansible eseguire il git pull origin master senza immettere una password senza problemi.

ma per quanto riguarda il secondo repository?

Quindi il tuo istinto sarà quello di prendere quella chiave e aggiungerla alle chiavi di distribuzione di repo2 , ma github.com genererà un errore e ti dirà che la chiave è già in uso.

Ora vai e genera un’altra chiave (usando ssh-keygen -t rsa -C "[email protected]" senza password ovviamente), e in modo che questo non diventi un disastro, ora ssh-keygen -t rsa -C "[email protected]" tue chiavi in ​​questo modo:

  • repo1 : (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 : (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Ora repo2 la nuova chiave pubblica sulla configurazione delle chiavi di distribuzione di repo2 su github.com, ma ora hai un problema con ssh da gestire.

Come può ssh indicare quale chiave usare se i repository sono ospitati nello stesso dominio github.com ?

Il tuo file .ssh/config punta a github.com e non sa quale chiave usare quando è il momento di fare il pull.

Quindi ho trovato un trucco con github.com. Puoi dire al tuo client ssh che ciascun repository vive in un sottodominio github.com diverso, in questi casi, saranno repo1.github.com e repo2.github.com

Quindi, la prima cosa è la modifica dei file .git/config sui cloni del repository, quindi appaiono come questi:

Per repo1

 [remote "origin"] url = "ssh://[email protected]/alice/repo1.git" 

Per repo2

 [remote "origin"] url = "ssh://[email protected]/alice/repo2.git" 

E poi, sul tuo file .ssh/config , ora potrai inserire una configurazione per ogni sottodominio 🙂

 Host repo1.github.com HostName github.com User git IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa IdentitiesOnly yes Host repo2.github.com HostName github.com User git IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa IdentitiesOnly yes 

Ora sei in grado di git pull origin master senza inserire alcuna password da entrambi i repository.

Se si dispone di più macchine, è ansible copiare le chiavi su ciascuna delle macchine e riutilizzarle, ma si consiglia di eseguire il lavoro sulle gambe per generare 1 chiave per macchina e repo. Avrai molte più chiavi da gestire, ma sarai meno vulnerabile se ti viene compromesso.

Usa il parametro IdentityFile nel tuo ~/.ssh/config :

 Host github.com HostName github.com IdentityFile ~/.ssh/github.rsa User petdance 

Ho 2 account su github, ed ecco cosa ho fatto (su linux ) per farlo funzionare.

chiavi

  • Crea 2 coppie di chiavi rsa, tramite ssh-keygen , ssh-keygen nome appropriato, in modo da semplificarti la vita.
  • Aggiungi chiavi private all’agente locale tramite ssh-add path_to_private_key
  • Per ogni account github, carica una chiave pubblica (distinta).

Configurazione

~ / .ssh / config

  Host github-kc Hostname github.com User git IdentityFile ~/.ssh/github_rsa_kc.pub # LogLevel DEBUG3 Host github-abc Hostname github.com User git IdentityFile ~/.ssh/github_rsa_abc.pub # LogLevel DEBUG3 

Imposta l’URL remoto per il repo:

  • Per il repo in Host github-kc :
    git remote set-url origin [email protected]:kuchaguangjie/pygtrans.git
  • Per il repo in Host github-abc :
    git remote set-url origin [email protected]:abcdefg/yyy.git

spiegazione

Opzioni in ~/.ssh/config :

  • Host github-
    L’host può essere qualsiasi valore che possa identificare un host più un account, non è necessario che sia un host reale, ad esempio github-kc identifica uno dei miei account su github per il mio laptop locale,

    Quando si imposta l’url remoto per un repository git, questo è il valore da inserire dopo [email protected] , è così che un repository esegue il mapping su un host, ad esempio git remote set-url origin [email protected]:kuchaguangjie/pygtrans.git

  • [Di seguito sono riportate le opzioni secondarie Host ]
  • Hostname
    specificare il nome host effettivo, basta usare github.com per github,
  • Git User
    l’utente è sempre git per github,
  • IdentityFile
    specificare la chiave da usare, basta mettere il percorso una chiave pubblica,
  • LogLevel
    specificare il livello di log per eseguire il debug, in caso di problemi, DEBUG3 fornisce le informazioni più dettagliate.

Nel mio caso nessuna delle soluzioni precedenti ha risolto il problema, ma ssh-agent lo fa. Fondamentalmente, ho fatto quanto segue:

  1. Genera coppia di chiavi usando ssh-keygen mostrato sotto. Genera una coppia di chiavi (in questo esempio .\keyfile e .\keyfile.pub )

    ssh-keygen -t rsa -b 4096 -C "[email protected]" -f keyfile

  2. Carica keyfile.pub nel provider git

  3. Avvia ssh-agent sulla tua macchina (puoi controllare con ps -ef | grep ssh-agent per vedere se è già in esecuzione)
  4. Esegui ssh-add .\keyfile per aggiungere credenziali
  5. Ora puoi eseguire git clone [email protected]:username/project.git

Ho passato molto tempo a capire tutti i passaggi. Quindi descriviamo passo dopo passo:

  1. Crea un nuovo file di identity framework usando ssh-keygen -t rsa . Dagli un’alternativa come proj1.id_rsa e colpisci senza dubbio perché non hai bisogno di una passphrase.
  2. Aggiungi una nuova sezione in .ssh/config :

    Host proj1.github.com
    HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/proj1.id_rsa

Prendi in considerazione la prima sezione e nota che proj1.github.com torneremo alla sezione successiva.

  1. Aggiungi l’identity framework all’agente ssh-add ~/.ssh/proj1.id_rsa
  2. Quello che ho incasinato la prima volta – ora quando vuoi clonare un repository proj1 lo fai usando proj1.github.com (esattamente l’host dal file di configurazione). git clone [email protected] .

Un buon tutorial.

Non fare casino con gli host

Ero solito,

 Host github.com HostName github.com IdentityFile ~/.ssh/github_rsa User [email protected] 

Si è svegliato bene.

Usa l’impostazione sopra nel tuo file .ssh / config per diverse chiavi rsa per diversi nomi utente.

Come complemento della risposta di @stefano, è meglio usare il comando con -f quando si genera una nuova chiave SSH per un altro account,

 ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "[email protected]" 

Poiché il file id_rsa_work non esiste nel percorso ~/.ssh/ , e creo questo file manualmente, e non funziona 🙁

Io uso gli script di shell per passare a qualsiasi account che voglio essere “attivo”. In sostanza, si inizia da un nuovo inizio, si ottiene un account configurato correttamente e funzionante, quindi si spostano questi file su un nome con il prefisso appropriato. Da quel momento in poi puoi usare il comando “github” o “gitxyz” per cambiare:

 # my github script cd ~/.ssh rm id_rsa rm id_rsa.pub rm config ln git_dhoerl id_rsa ln git_dhoerl.pub id_rsa.pub ln config_dhoerl config git config --global user.email "[email protected]" git config --global github.user "dhoerl" # git config --global github.token "whatever_it_is" # now unused ssh-add -D 

Ho avuto molta fortuna con questo. Ho anche creato uno script di esecuzione in Xcode (per gli utenti Mac) in modo che non costruisse il mio progetto a meno che non avessi l’impostazione corretta (dal momento che utilizza git):

Esegui script inserito dopo dipendenze:

 #! /bin/ksh if [ "$(git config --global --get user.email)" != "[email protected].com" ] then exit 1 fi 

Un’alternativa forse più semplice alla modifica del file di configurazione ssh (come suggerito in tutte le altre risposte), consiste nel configurare un singolo repository per utilizzare una chiave ssh diversa (ad esempio non predefinita).

All’interno del repository per il quale si desidera utilizzare una chiave diversa, eseguire:

 git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount' 

E assicurati che la tua chiave sia stata aggiunta a ssh-agent eseguendo:

 ssh-add ~/.ssh/id_rsa_anotheraccount 

Tieni presente che il comando precedente aggiungerà solo la chiave per ssh-agent per la tua sessione corrente. Se vuoi che funzioni, devi “permanentemente” aggiungerlo al tuo ssh-agent. Ad esempio, ecco come farlo per Ubuntu e qui per OSX .

Dovrebbe anche essere ansible ridimensionare questo approccio a più repository usando git config globale e include condizionali ( vedi esempio ).