Mehrere GitHub-Konten und SSH-Konfiguration


249

Ich habe einige Probleme damit, dass zwei verschiedene SSH-Schlüssel / GitHub-Konten gut zusammenspielen. Ich habe folgendes Setup:

Repos von einem Konto aus mit zugänglich git@github.com:accountname

Repos, auf die von einem anderen Konto aus zugegriffen werden kann git@github.com:anotheraccount

Jedes Konto hat einen eigenen SSH-Schlüssel. Beide SSH-Schlüssel wurden hinzugefügt und ich habe eine Konfigurationsdatei erstellt. Ich glaube jedoch nicht, dass die Konfigurationsdatei korrekt ist. Ich bin nicht ganz sicher, wie ich angeben soll, dass Repos, auf die mit zugegriffen wird, verwendet werden git@github.com:accountnamesollen id_rsaund git@github.com:anotheraccountsollen id_rsa_anotheraccount.


Ich fand diesen Link hilfreich medium.freecodecamp.org/…
jgreen

Ich habe 3 separate SSH-Identitäten in ~ / .ssh / config. Der für den Schulserver hat einen Passcode; Die 2 für separate Arbeit / persönliche GitHub-Konten nicht. Das Ausführen schlug git pullimmer wieder fehl und fragte nach dem Schulpasscode, trotz separater Identitätsdateien "IdentitiesOnly = yes", separater Domänen und Hostnamen, die alle in ssh-add -l... vorhanden waren. Der Uni-Schlüssel war unabhängig von dieser Einrichtung "zuerst". Musste seinen Abschnitt unter die anderen in .ssh / config verschieben, und jetzt ist es git pullvon beiden GitHub-Konten erfolgreich, ohne nach einem uni ssh-Passwort zu fragen.
mc01

Antworten:


309

Andy Lesters Antwort ist korrekt, aber ich habe einen wichtigen zusätzlichen Schritt gefunden, den ich machen musste, damit dies funktioniert. Bei dem Versuch, zwei Profile einzurichten, eines für den persönlichen und eines für die Arbeit, war mein ~/.ssh/configungefähr wie folgt:

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

Mein Arbeitsprofil wurde erst erstellt, als ich ein ssh-add ~/.ssh/work_rsa. Danach verwendeten Verbindungen zu Github das richtige Profil. Zuvor wurde standardmäßig der erste öffentliche Schlüssel verwendet.

Wenn bei Verwendung keine Verbindung zu Ihrem Authentifizierungsagenten hergestellt werden konnte ssh-add,
überprüfen Sie Folgendes : https://stackoverflow.com/a/17695338/1760313


39
Vielen Dank! - Das hat ssh-addmir gefehlt.
Salbei

Durch die Verwendung von ssh-add konnte ich feststellen, dass ich die Dateiberechtigungen für den Schlüssel nicht richtig eingestellt hatte. Einmal habe ich behoben, dass alles funktioniert hat. So danke!
Phatmann

6
Siehe auch doblock.com/articles/… . Die wichtigste neue Information ist, dass Sie möglicherweise den Benutzernamen (in diesem Beispiel "work") zum Hostnamen in der Remote-URL hinzufügen müssen, dh git@work.github.com: work / my_repo.git (as im Gegensatz zu "git@github.com ...")
BobS


15
Fügen Sie IdentitiesOnly yesdem Host *Abschnitt Ihrer ~/.ssh/configDatei hinzu , um das Problem zu beheben, dass "standardmäßig der erste öffentliche Schlüssel verwendet wurde" . Dies weist ssh an, die von Ihnen angegebenen IdentityFiles tatsächlich zu verwenden, anstatt den Server mit allen zu spammen.
Mechanische Schnecke

172

Ich musste dies kürzlich tun und all diese Antworten und ihre Kommentare durchsehen, um die Informationen schließlich zusammenzufügen. Deshalb werde ich alles hier in einem Beitrag zusammenfassen, damit Sie es sich bequem machen können:


Schritt 1: SSH-Tasten
Erstellen Sie alle benötigten Schlüsselpaare . In diesem Beispiel habe ich mich default / original 'id_rsa' (was der Standard ist) und meine neue 'id_rsa-work' genannt:

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


Schritt 2: ssh config Richten Sie
mehrere ssh-Profile ein, indem Sie ~ / .ssh / config erstellen / ändern . Beachten Sie die leicht abweichenden 'Host'-Werte:

# 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


Schritt 3: ssh-add
Möglicherweise müssen Sie dies tun oder nicht. Listen Sie zur Überprüfung Identitätsfingerabdrücke auf, indem Sie Folgendes ausführen:

$ 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)

Wenn Ihre Einträge nicht vorhanden sind, führen Sie Folgendes aus:

ssh-add ~/.ssh/id_rsa_work


Schritt 4: Test
Um zu testen, ob Sie alles richtig gemacht haben, empfehle ich die folgende schnelle Überprüfung:

$ 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.

Beachten Sie, dass Sie den Hostnamen (github / work.github) ändern müssen, je nachdem, welchen Schlüssel / welche Identität Sie verwenden möchten. Aber jetzt solltest du gut gehen! :) :)


1
Dies ist eine großartige Antwort. Ich musste ssh-add verwenden, um beide ssh-Schlüssel hinzuzufügen, um die Konfigurationsdatei zu verwenden. Danke :)
gaurav.singharoy

Das einzige, was ich hinzufügen möchte, ist, wenn Sie ssh-keygen -t rsa ausführen, erhalten Sie einen Standarddateinamen, in den Sie Ihren benutzerdefinierten Dateinamen eingeben.
Donato

Eine der besten Antworten. Auch dieses Video hat mir geholfen. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif

Guter Beitrag, wäre schön, wenn dieser Beitrag das Festlegen Ihrer Git-Konfiguration 'email' beinhalten würde: help.github.com/articles/…
Dave Engineer

43

Angenommen, es alicehandelt sich um einen Benutzer von github.com mit zwei oder mehr privaten Repositorys repoN. In diesem Beispiel arbeiten wir mit nur zwei Repositorys mit dem Namen repo1undrepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Sie müssen aus diesen Repositorys ziehen, ohne Kennwörter einzugeben, wahrscheinlich auf einem Server oder auf mehreren Servern. Sie möchten zum git pull origin masterBeispiel eine Leistung erbringen, und Sie möchten, dass dies geschieht, ohne nach einem Kennwort zu fragen.

Sie beschäftigen sich nicht gerne mit ssh-agent. Sie haben ~/.ssh/configeine Datei entdeckt (oder entdecken sie gerade) , in der Ihr ssh-Client weiß, welchen privaten Schlüssel er je nach Hostname und Benutzername verwenden soll. Der einfache Konfigurationseintrag sieht so aus Dies:

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

Sie haben also Ihr (alice_github.id_rsa, alice_github.id_rsa.pub)Schlüsselpaar erstellt, sind dann auch zur .git/configDatei Ihres Repositorys gegangen und haben die URL Ihrer Fernbedienung so geändert origin:

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

Und schließlich sind Sie zum Repository- Settings > Deploy keysBereich gegangen und haben den Inhalt von hinzugefügtalice_github.id_rsa.pub

An diesem Punkt können Sie dies git pull origin masterohne Eingabe eines Passworts ohne Probleme tun .

aber was ist mit dem zweiten Repository?

Ihr Instinkt wird also sein, diesen Schlüssel zu greifen und ihn zu repo2den Bereitstellungsschlüsseln hinzuzufügen , aber github.com wird einen Fehler machen und Ihnen mitteilen, dass der Schlüssel bereits verwendet wird.

Jetzt generieren Sie einen weiteren Schlüssel ( ssh-keygen -t rsa -C "alice@alice.com"natürlich ohne Passwörter), und damit dies nicht zu einem Chaos wird, benennen Sie Ihre Schlüssel jetzt wie folgt:

  • repo1 Schlüsselpaar: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 Schlüsselpaar: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Sie werden jetzt den neuen öffentlichen Schlüssel in repo2die Konfiguration "Schlüssel bereitstellen" auf github.com einfügen, aber jetzt haben Sie ein SSH-Problem, mit dem Sie sich befassen müssen.

Wie kann ssh feststellen, welcher Schlüssel verwendet werden soll, wenn die Repositorys in derselben github.comDomäne gehostet werden ?

Ihre .ssh/configDatei zeigt auf github.comund weiß nicht, welchen Schlüssel Sie verwenden sollen, wenn der Pull ausgeführt werden soll.

Also habe ich mit github.com einen Trick gefunden. Sie können Ihrem SSH-Client mitteilen, dass sich jedes Repository in einer anderen github.com-Subdomain befindet. In diesen Fällen handelt es sich um repo1.github.comundrepo2.github.com

Als erstes bearbeiten Sie die .git/configDateien auf Ihren Repo-Klonen, sodass sie stattdessen so aussehen:

Für repo1

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

Für repo2

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

Und dann können Sie in Ihrer .ssh/configDatei eine Konfiguration für jede Subdomain eingeben :)

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

Jetzt können Sie git pull origin masterkeine Kennwörter mehr aus beiden Repositorys eingeben.

Wenn Sie mehrere Maschinen haben, können Sie die Schlüssel auf jede der Maschinen kopieren und wiederverwenden. Ich würde jedoch empfehlen, die Beinarbeit zu erledigen, um 1 Schlüssel pro Maschine und Repo zu generieren. Sie werden viel mehr Schlüssel zu handhaben haben, aber Sie werden weniger anfällig sein, wenn einer kompromittiert wird.


1
Die Angabe der Subdomain, die dem Host entspricht, .ssh/configist der entscheidende Schritt - vielen Dank dafür
Mike Miller

22

Ich habe 2 Accounts auf Github, und hier ist, was ich getan habe linux, damit es funktioniert.

Schlüssel

  • Erstellen Sie 2 Paar RSA-Schlüssel über ssh-keygen, benennen Sie sie richtig, damit das Leben einfacher wird.
  • Fügen Sie dem lokalen Agenten über private Schlüssel hinzu ssh-add path_to_private_key
  • Laden Sie für jedes Github-Konto einen (eindeutigen) öffentlichen Schlüssel hoch.

Aufbau

~ / .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

Remote-URL für Repo festlegen:

  • Für Repo im Host github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • Für Repo im Host github-abc:

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

Erklärung

Optionen in ~/.ssh/config:

  • Hostgithub- <identify_specific_user>
    Host kann ein beliebiger Wert sein, der einen Host und ein Konto identifizieren kann. Es muss kein echter Host sein, z. B. github-kceines meiner Konten auf github für meinen lokalen Laptop.

    Wenn Sie die Remote-URL für ein Git-Repo festlegen, ist dies der Wert, nach git@dem ein Repo einem Host zugeordnet werden muss, zgit remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [Es folgen Unteroptionen von Host]
  • Hostname
    github.comGeben Sie den tatsächlichen Hostnamen an. Verwenden Sie ihn einfach für github.
  • Usergit
    der benutzer ist immer gitfür github,
  • IdentityFile
    Geben Sie den zu verwendenden Schlüssel an. Geben Sie einfach den Pfad als öffentlichen Schlüssel ein.
  • LogLevel
    Geben Sie die zu debuggende Protokollstufe an, falls ein Problem vorliegt, und DEBUG3geben Sie die detailliertesten Informationen an.


schön - brauchte nicht ssh-add path_to_private_key- wahrscheinlich, weil der Agent in diesem Fall nicht benötigt wird. Die Konfigurationsdatei definiert explizit den Pfad zu den Schlüsseln.
Mark Chackerian

2
@MarkChackerian Ich denke, Sie brauchen das nicht, ssh-addweil Ihre Schlüssel nicht passwortgeschützt sind oder (wenn Sie einen Mac verwenden) der OSX-Schlüsselbund dies für Sie erledigt. ssh-addverhindert, dass Sie bei jedem Zugriff auf Ihre Schlüssel die Passphrase eingeben müssen.
Ashhar Hasan

18

Verwenden Sie den IdentityFileParameter in Ihrem ~/.ssh/config:

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

Danke, aber das ist nicht ganz richtig. Ich habe die Antwort gefunden und unten geteilt.
Radesix

Ich bin mir ziemlich sicher, dass mein Ansatz in Ihrem Fall funktionieren wird. Sie können verschiedene Benutzer und verschiedene Identitätsdateien identifizieren. Sie müssen lediglich einen anderen Host-Parameter in der Zeilengruppe config angeben.
Andy Lester

1
Andy, laut dem Link, den ich unten gefunden habe, musste ich das .com vom Host löschen. Sobald ich das getan habe, hat es gut funktioniert.
Radesix

5

Eine möglicherweise einfachere Alternative zum Bearbeiten der SSH-Konfigurationsdatei (wie in allen anderen Antworten vorgeschlagen) besteht darin, ein einzelnes Repository für die Verwendung eines anderen (z. B. nicht standardmäßigen) SSH-Schlüssels zu konfigurieren.

Führen Sie in dem Repository, für das Sie einen anderen Schlüssel verwenden möchten, Folgendes aus:

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

Und stellen Sie sicher, dass Ihr Schlüssel dem SSH-Agenten hinzugefügt wird, indem Sie Folgendes ausführen:

ssh-add ~/.ssh/id_rsa_anotheraccount

Beachten Sie, dass der obige Befehl nur dem ssh-agent für Ihre aktuelle Sitzung einen Schlüssel hinzufügt. Wenn dies für immer funktionieren soll, müssen Sie es Ihrem SSH-Agenten "dauerhaft" hinzufügen. Hier erfahren Sie beispielsweise, wie dies für Ubuntu und hier für OSX gemacht wird .

Es sollte auch möglich sein, diesen Ansatz mithilfe der globalen Git-Konfiguration und der bedingten Includes auf mehrere Repositorys zu skalieren ( siehe Beispiel ).


4

Ich habe viel Zeit damit verbracht, alle Schritte zu verstehen. Beschreiben wir also Schritt für Schritt:

  1. Erstellen Sie eine neue Identitätsdatei mit ssh-keygen -t rsa. Geben Sie ihm eine Alternative wie proj1.id_rsaund schlagen Sie ohne Zweifel, weil Sie keine Passphrase benötigen.
  2. Neuen Abschnitt hinzufügen in .ssh/config:

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

Berücksichtigen Sie den ersten Abschnitt und beachten Sie, dass proj1.github.comwir später auf den Abschnitt zurückkommen werden.

  1. Fügen Sie die Identität dem SSH-Agenten hinzu ssh-add ~/.ssh/proj1.id_rsa
  2. Das habe ich zum ersten Mal durcheinander gebracht - jetzt, wenn Sie ein proj1-Repo klonen möchten, tun Sie es mit proj1.github.com(genau dem Host aus der Konfigurationsdatei). git clone git@proj1.github.com.

Ein gutes Tutorial.

Leg dich nicht mit den Gastgebern an


Danke für den Link zum Turorial! Sie haben einen Tippfehler: Die Schlüsselnamen id_rsa_proj1und proj1_id_rsasollten eigentlich gleich sein. Sie können .git/configIhrer Antwort auch den Teil über Einstellungen aus dem Lernprogramm hinzufügen .
Cezar

Sie haben noch einen Tippfehler: proj1.id_rsavs.proj1_id_rsa
Cezar

3

In meinem Fall hat keine der oben genannten Lösungen mein Problem gelöst, aber ssh-agent. Grundsätzlich habe ich folgendes gemacht:

  1. Generieren Sie ein Schlüsselpaar mit ssh-keygen (siehe unten). Es wird ein Schlüsselpaar generiert (in diesem Beispiel .\keyfileund .\keyfile.pub)

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

  2. Laden Sie keyfile.pubzum git - Provider

  3. Starten Sie ssh-agent auf Ihrem Computer (Sie können überprüfen ps -ef | grep ssh-agent, ob es bereits ausgeführt wird).
  4. Ausführen ssh-add .\keyfile, um Anmeldeinformationen hinzuzufügen
  5. Jetzt kannst du rennen git clone git@provider:username/project.git

2

Ich benutzte,

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

Es war gut.

Verwenden Sie die obige Einstellung in Ihrer .ssh / config-Datei für verschiedene rsa-Schlüssel für verschiedene Benutzernamen.


2

Als Ergänzung zu @stefanos Antwort ist es besser, den Befehl zu verwenden, -fwenn ein neuer SSH-Schlüssel für ein anderes Konto generiert wird.

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

Da die id_rsa_workDatei nicht im Pfad vorhanden ~/.ssh/ist und ich diese Datei manuell erstelle und sie nicht funktioniert :(


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.