Conti multipli GitHub e configurazione SSH


249

Ho qualche problema a far funzionare bene due chiavi SSH / account GitHub diversi. Ho la seguente configurazione:

Repos accessibili da un account utilizzando git@github.com:accountname

Repos accessibili da un altro account utilizzando git@github.com:anotheraccount

Ogni account ha la propria chiave SSH. Sono state aggiunte entrambe le chiavi SSH e ho creato un file di configurazione. Tuttavia, non credo che il file di configurazione sia corretto. Non sono del tutto sicuro su come specificare che i repository a cui si accede git@github.com:accountnamedovrebbero usare id_rsae git@github.com:anotheraccountdovrebbero usare id_rsa_anotheraccount.


Ho trovato utile questo link medium.freecodecamp.org/…
jgreen il

Ho 3 identità SSH separate in ~ / .ssh / config. Quello per il server della scuola ha un passcode; i 2 per lavoro separato / accesso personale a GitHub no. L'esecuzione git pullcontinuava a fallire e chiedeva il passcode della scuola, nonostante i file Identity separati, "IdentitiesOnly = yes", domini e nomi host separati, tutti presenti in ssh-add -l... La chiave uni era "prima" indipendentemente da quella configurazione. Ho dovuto spostare la sua sezione sotto le altre in .ssh / config, e ora git pullda entrambi gli accessi GitHub riesce senza richiedere la password uni ssh.
mc01,

Risposte:


309

La risposta di Andy Lester è accurata, ma ho trovato un importante passo in più che dovevo fare per farlo funzionare. Nel tentativo di impostare due profili, uno per il personale e uno per il lavoro, il mio ~/.ssh/configera all'incirca 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 non ho fatto un ssh-add ~/.ssh/work_rsa. Successivamente le connessioni a github hanno utilizzato il profilo corretto. In precedenza avevano predefinito la prima chiave pubblica.

Per Impossibile aprire una connessione al proprio agente di autenticazione durante l'utilizzo ssh-add,
controllare: https://stackoverflow.com/a/17695338/1760313


39
Grazie! - ssh-addera quello che mi mancava.
saggio il

Usando ssh-add, ho potuto vedere che non avevo i permessi dei file per la chiave impostata correttamente. Una volta ho risolto che tutto ha funzionato. Quindi grazie!
Phatmann,

6
Vedi anche doblock.com/articles/… . La nuova chiave di informazione è che potrebbe essere necessario aggiungere il nome utente ("lavoro", in questo esempio) al nome host nell'URL remoto, ad esempio git@work.github.com: work / my_repo.git (as al contrario di "git@github.com ...")
BobS


15
Per risolvere il problema che "hanno impostato per default sulla prima chiave pubblica", aggiungi IdentitiesOnly yesalla Host *sezione del tuo ~/.ssh/configfile. Questo dice a ssh di usare effettivamente i file di identità specificati, piuttosto che inviare spam al server con tutti loro.
Lumaca meccanica

172

Di recente ho dovuto fare questo e ho dovuto vagliare tutte queste risposte e i loro commenti per mettere insieme le informazioni, quindi metterò tutto qui, in un post, per tua comodità:


Passaggio 1: chiavi ssh
Crea tutte le chiavi di cui hai bisogno. In questo esempio mi sono chiamato "id_rsa" predefinito / originale (che è quello predefinito) e il mio nuovo "id_rsa-work":

ssh-keygen -t rsa -C "stefano@work.com"


Passaggio 2: configurazione ssh
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
Potrebbe essere necessario o meno eseguire questa operazione. Per verificare, elenca le impronte digitali dell'identità 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 stefano@work.com (RSA)

Se le voci non sono presenti, esegui:

ssh-add ~/.ssh/id_rsa_work


Passaggio 4: test
Per provare di aver fatto tutto correttamente, ti suggerisco il seguente controllo rapido:

$ ssh -T git@github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T git@work.github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

Tieni presente che dovrai cambiare il nome host (github / work.github) in base alla chiave / identità che desideri utilizzare. Ma ora dovresti essere bravo ad andare! :)


1
Questa è un'ottima risposta Ho dovuto usare ssh-add per aggiungere entrambi i tasti ssh per utilizzare il file di configurazione .. Grazie :)
gaurav.singharoy

L'unica cosa che mi piace aggiungere è quando esegui ssh-keygen -t rsa, ti darà un nome file predefinito, che è dove inserisci il tuo nome file personalizzato.
Donato,

Una delle migliori risposte. Anche questo video mi ha aiutato. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingArif

Buon post, sarebbe bello se questo post includesse l'impostazione della tua e-mail di configurazione git: help.github.com/articles/…
Dave Engineer

43

Diciamo che aliceè un utente github.com, con 2 o più repository privati repoN. Per questo esempio lavoreremo con solo due repository denominati repo1erepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Devi essere in grado di estrarre da questi repository senza inserire una password probabilmente su un server o su più server. Ad git pull origin masteresempio, vuoi esibirti e vuoi che ciò accada senza chiedere una password.

Non ti piace trattare con ssh-agent, hai scoperto (o lo stai scoprendo ora) su ~/.ssh/configun file che consente al tuo client ssh di sapere quale chiave privata utilizzare in base al nome host e al nome utente, con una semplice voce di configurazione che assomiglia Questo:

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 .git/configfile del tuo repository e hai modificato l'URL del tuo telecomando originper essere qualcosa del genere:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

E infine sei andato nella Settings > Deploy keyssezione del repository e hai aggiunto il contenuto dialice_github.id_rsa.pub

A questo punto potresti fare il tuo git pull origin mastersenza inserire una password senza problemi.

ma per quanto riguarda il secondo repository?

Quindi il tuo istinto sarà quello di afferrare quella chiave e aggiungerla alle repo2chiavi di distribuzione, ma github.com sbaglierà e ti dirà che la chiave è già in uso.

Ora vai e generi un'altra chiave (usando ssh-keygen -t rsa -C "alice@alice.com"ovviamente senza password), e in modo che questo non diventi un disastro, ora nominerai le tue chiavi in ​​questo modo:

  • repo1 coppia di chiavi: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 coppia di chiavi: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Ora inserirai la nuova chiave pubblica nella repo2configurazione di distribuzione delle chiavi su github.com, ma ora hai un problema ssh da affrontare.

Come può ssh dire quale chiave usare se i repository sono ospitati sullo stesso github.comdominio?

Il tuo .ssh/configfile punta github.come 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 ogni repository vive in un sottodominio github.com diverso, in questi casi saranno repo1.github.comerepo2.github.com

Quindi la prima cosa da fare è modificare i .git/configfile sui cloni dei repository, quindi sembrano così:

Per repo1

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

Per repo2

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

E poi, sul tuo .ssh/configfile, ora sarai in grado di inserire una configurazione per ciascun 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 puoi farlo git pull origin mastersenza inserire alcuna password da entrambi i repository.

Se hai più macchine, potresti copiare le chiavi su ciascuna delle macchine e riutilizzarle, ma ti consiglio di fare il lavoro di gamba per generare 1 chiave per macchina e repository. Avrai molte più chiavi da gestire, ma sarai meno vulnerabile se uno viene compromesso.


1
Specificare il sottodominio corrispondente all'host .ssh/configè il passaggio cruciale - grazie mille per questo
Mike Miller,

22

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, assegnale un nome appropriato, in modo da semplificare 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 repository:

  • Per repository in Host github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • Per repository in Host github-abc:

    git remote set-url origin git@github-abc:abcdefg/yyy.git
    

spiegazione

Opzioni in ~/.ssh/config:

  • Hostgithub- <identify_specific_user> L'
    host potrebbe essere qualsiasi valore in grado di identificare un host più un account, non è necessario che sia un host reale, ad esempio github-kcidentificare 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 git@, ecco come un repository esegue il mapping a un host, ad es.git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [Di seguito sono riportate le opzioni secondarie di Host]
  • Hostname
    specifica il nome host effettivo, basta usare github.comper github,
  • Usergit
    l'utente è sempre gitper github,
  • IdentityFile
    specifica la chiave da usare, basta inserire il percorso come chiave pubblica,
  • LogLevel
    specificare il livello di registro per il debug, se presente, DEBUG3fornisce le informazioni più dettagliate.


adorabile - non necessario ssh-add path_to_private_key- probabilmente perché l'agente non è richiesto in questo caso. Il file di configurazione definisce esplicitamente il percorso delle chiavi.
Mark Chackerian,

2
@MarkChackerian Penso che non sia necessario ssh-addperché le tue chiavi non sono protette da password o (se sei su un Mac) il portachiavi OSX lo sta gestendo per te. ssh-addti impedisce di inserire la passphrase ogni volta che accedi alle tue chiavi.
Ashhar Hasan,

18

Usa il IdentityFileparametro nel tuo ~/.ssh/config:

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

Grazie ma questo non è abbastanza preciso. Ho trovato la risposta e condiviso di seguito.
Radesix,

Sono abbastanza sicuro che il mio approccio funzionerà nel tuo caso. È possibile identificare utenti diversi e file di identità diversi. Devo solo assegnare a ciascuno un diverso parametro Host nella stanza di configurazione.
Andy Lester,

1
Andy, secondo il link che ho trovato di seguito, dovevo eliminare il .com dall'host. Una volta che l'ho fatto ha funzionato bene.
Radesix,

5

Un'alternativa forse più semplice alla modifica del file di configurazione di ssh (come suggerito in tutte le altre risposte), è quella di configurare un singolo repository per usare una chiave ssh diversa (es. 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 aggiunta a ssh-agent, eseguendo:

ssh-add ~/.ssh/id_rsa_anotheraccount

Tieni presente che il comando sopra aggiungerà solo la chiave all'agente ssh per la sessione corrente. Se vuoi che funzioni per sempre, devi "permanentemente" aggiungerlo al tuo agente ssh. Ad esempio, ecco come farlo per Ubuntu e qui per OSX .

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


4

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

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

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

  2. Caricare keyfile.pub sul provider git

  3. Avvia ssh-agent sul tuo computer (puoi verificare con ps -ef | grep ssh-agent se è già in esecuzione)
  4. Correre ssh-add .\keyfile per aggiungere credenziali
  5. Adesso puoi correre git clone git@provider:username/project.git

4

Ho trascorso molto tempo a comprendere tutti i passaggi. Quindi descriviamo passo dopo passo:

  1. Crea un nuovo file di identità usando ssh-keygen -t rsa. Dagli un'alternativa simile proj1.id_rsae 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.comtorneremo alla sezione in seguito.

  1. Aggiungi l'identità all'agente ssh ssh-add ~/.ssh/proj1.id_rsa
  2. Questo è quello che ho sbagliato 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 git@proj1.github.com.

Un buon tutorial.

Non fare confusione con gli host


Grazie per il link al turorial! Hai un refuso: i nomi delle chiavi id_rsa_proj1e in proj1_id_rsarealtà dovrebbero essere uguali. Puoi anche aggiungere la parte relativa alle .git/configimpostazioni del tutorial alla tua risposta.
Cezar,

Hai ancora un refuso: proj1.id_rsavs.proj1_id_rsa
cezar

2

Ero solito,

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User abc@gmail.com

Si svegliò bene.

Utilizzare l'impostazione sopra nel file .ssh / config per chiavi rsa diverse per nomi utente diversi.


2

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

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"

Dal momento che il id_rsa_workfile non esiste nel percorso ~/.ssh/e lo creo manualmente e non funziona :(


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.