Mehrere GitHub-Konten und SSH-Konfiguration

Ich habe Probleme, zwei verschiedene SSH-Schlüssel / GitHub-Accounts zu bekommen, um gut zusammen zu spielen. Ich habe folgendes Setup:

Repos, auf die mit git@github.com:accountname werden git@github.com:accountname

Repos, die von einem anderen Konto aus über git@github.com:anotheraccount weiterer Account

Jedes Konto hat einen eigenen SSH-Schlüssel. Beide SSH-Schlüssel wurden hinzugefügt und ich habe eine Konfigurationsdatei erstellt. Ich glaube nicht, dass die Konfigurationsdatei korrekt ist. Ich bin mir nicht ganz sicher, wie ich die git@github.com:accountname mit git@github.com:accountname soll git@github.com:accountname sollte id_rsa und git@github.com:anotheraccount sollte id_rsa_anotheraccount .

    Andy Lesters Antwort ist korrekt, aber ich fand einen wichtigen zusätzlichen Schritt, den ich machen musste, um dies zum Laufen zu bringen. Bei dem Versuch, zwei Profile einzurichten, eins für persönlich und eins für Arbeit, war meine ~/.ssh/config ungefä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 dauerte nicht, bis ich ein ssh-add ~/.ssh/work_rsa . Danach verwendeten Verbindungen zu GitHub das richtige Profil. Zuvor waren sie auf den ersten öffentlichen Schlüssel voreingestellt.

    Bei Verbindung mit Ihrem ssh-add konnte keine Verbindung zu Ihrem Authentifizierungs-Agent hergestellt werden.
    Überprüfen Sie: https://Stackoverflow.com/a/17695338/1760313

    Ich musste dies kürzlich tun und musste alle diese Antworten und ihre Kommentare durchgehen, um die Informationen schließlich zusammenzufügen, also werde ich sie hier, in einem Beitrag, für Ihre Bequemlichkeit einfügen:

    Schritt 1: SSH-Schlüssel
    Erstellen Sie beliebige Schlüsselpaare, die Sie benötigen. In diesem Beispiel habe ich mich als Standard / Original ‘id_rsa’ (das ist der Standard) und mein neues ‘id_rsa-work’ benannt:

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

    Schritt 2: SSH-Konfiguration
    Richten Sie mehrere ssh-Profile ein, indem Sie ~ / .ssh / config erstellen / ändern . Beachten Sie die geringfügig 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
    Sie müssen dies tun oder nicht müssen. Zur Überprüfung listen Sie die Identitäts-Fingerabdrü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 das alles richtig gemacht haben, schlage ich folgende schnelle Überprüfung vor:

     $ 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! 🙂

    Nehmen wir an, dass alice ein github.com-Benutzer ist, mit 2 oder mehr privaten Repositories repoN . In diesem Beispiel arbeiten wir mit nur zwei Repositories namens repo1 und repo2

    https://github.com/alice/repo1

    https://github.com/alice/repo2

    Sie müssen aus diesen Repositories zu ziehen sein, ohne ein Passwort einzugeben, wahrscheinlich auf einem Server oder auf mehreren Servern. Sie möchten zum Beispiel git pull origin master ausführen, und Sie möchten, dass dies geschieht, ohne nach einem Passwort zu fragen.

    Du ~/.ssh/config es nicht mit ssh-agent zu arbeiten, du hast entdeckt (oder ~/.ssh/config jetzt) ​​über ~/.ssh/config eine Datei, die deinem ssh-Client ~/.ssh/config , welcher private Schlüssel abhängig von Hostname und Benutzernamen verwendet werden soll einfacher Konfigurationseintrag, der so aussieht:

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

    Also hast du dein (alice_github.id_rsa, alice_github.id_rsa.pub) erstellt, dann bist du auch in die .git/config Datei deines Repositories gegangen und hast die URL deines entfernten origin so geändert:

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

    Und schließlich sind Sie zum Abschnitt Settings > Deploy keys des Repositorys alice_github.id_rsa.pub und haben den Inhalt von alice_github.id_rsa.pub

    An diesem Punkt könntest du deinen git pull origin master ohne ein Passwort ohne Probleme einzugeben.

    aber was ist mit dem zweiten Repository?

    Dein Instinkt wird also sein, diesen Schlüssel zu nehmen und ihn zu den repo2 -Schlüsseln von repo2 hinzuzufügen, aber github.com wird einen Fehler repo2 und dir sagen, dass der Schlüssel bereits benutzt wird.

    Jetzt gehst du und ssh-keygen -t rsa -C "alice@alice.com" einen anderen Schlüssel (mit ssh-keygen -t rsa -C "alice@alice.com" ohne Passwörter natürlich), und damit das kein Chaos wird, wirst du deine Schlüssel jetzt wie folgt benennen:

    • 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 nun den neuen öffentlichen Schlüssel in die repo2 -Schlüsselkonfiguration von repo2 auf github.com setzen, aber jetzt haben Sie ein ssh-Problem zu lösen.

    Wie kann SSH mitteilen, welcher Schlüssel verwendet werden soll, wenn die Repositories in derselben github.com Domain gehostet werden?

    Ihre .ssh/config Datei verweist auf github.com und sie weiß nicht, welchen Schlüssel sie verwenden soll, wenn es Zeit ist, den Pull .ssh/config .

    Also habe ich einen Trick mit github.com gefunden. Sie können Ihrem ssh-Client mitteilen, dass jedes Repository in einer anderen github.com-Subdomäne lebt. In diesen Fällen sind dies repo1.github.com und repo2.github.com

    Als Erstes müssen Sie die .git/config Dateien in Ihren Repo-Klonen bearbeiten, damit 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, in Ihrer .ssh/config Datei, können Sie jetzt 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 den git pull origin master ohne Eingabe von Passwörtern aus beiden Repositories ziehen.

    Wenn Sie mehrere Maschinen haben, könnten Sie die Schlüssel auf jede der Maschinen kopieren und sie wiederverwenden, aber ich würde empfehlen, die Leg-Arbeit auszuführen, um 1 Schlüssel pro Maschine und Repo zu generieren. Sie werden viel mehr Schlüssel haben, die Sie handhaben müssen, aber Sie werden weniger verwundbar sein, wenn Sie kompromittiert werden.

    Verwenden Sie den IdentityFile Parameter in Ihrer ~/.ssh/config :

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

    Ich habe 2 Accounts auf Github, und hier ist, was ich getan habe (auf 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 private Schlüssel über ssh-add path_to_private_key
    • Laden Sie für jeden GitHub-Account einen (eindeutigen) öffentlichen Schlüssel hoch.

    Aufbau

    ~ / .ssh / Konfig

      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 

    Entferne URL für Repo:

    • 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 :

    • Host github-
      Host kann ein beliebiger Wert sein, der einen Host plus einen Account identifizieren kann, er muss kein echter Host sein, zB github-kc identifiziert einen meiner Accounts auf github für meinen lokalen Laptop,

      Wenn Remote-URL für einen Git-Repo festgelegt wird, ist dies der Wert, der nach git@ wird, so wie ein Repo einem Host zugeordnet wird, z. B. git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git

    • [Im Folgenden sind Unteroptionen von Host ]
    • Hostname
      gib den tatsächlichen Hostnamen an, benutze einfach github.com für github,
    • User Git
      der Benutzer ist immer git für Github,
    • IdentityFile
      Geben Sie den zu verwendenden Schlüssel an, legen Sie einfach den Pfad als öffentlichen Schlüssel fest,
    • LogLevel
      Spezifizieren Sie DEBUG3 , um zu debuggen, wenn irgendein Problem DEBUG3 gibt DEBUG3 die detailliertesten Informationen.

    In meinem Fall hat keine der obigen Lösungen mein Problem getriggers, aber ssh-agent tut es. Grundsätzlich habe ich folgendes gemacht:

    1. Generieren Sie Schlüsselpaare mithilfe von ssh-keygen (siehe unten). Es erzeugt ein Schlüsselpaar (in diesem Beispiel .\keyfile und .\keyfile.pub )

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

    2. keyfile.pub zum git-Provider keyfile.pub

    3. Starten Sie ssh-agent auf Ihrem Rechner (Sie können mit ps -ef | grep ssh-agent überprüfen, ob es bereits läuft)
    4. Führen Sie ssh-add .\keyfile , um Anmeldeinformationen hinzuzufügen
    5. Jetzt können Sie git clone git@provider:username/project.git ausführen git clone git@provider:username/project.git

    Ich verbrachte viel Zeit, um alle Schritte zu verstehen. Also lasst uns Schritt für Schritt beschreiben:

    1. Erstellen Sie eine neue Identitätsdatei mit ssh-keygen -t rsa . Geben Sie ihm eine Alternative wie proj1.id_rsa und proj1.id_rsa Sie ohne Zweifel, da Sie keine Passphrase benötigen.
    2. .ssh/config neuen Abschnitt 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 wir proj1.github.com später zum Abschnitt zurückgehen.

    1. Fügen Sie dem ssh-Agenten ssh-add ~/.ssh/proj1.id_rsa die Identität ssh-add ~/.ssh/proj1.id_rsa
    2. Das, was ich das erste Mal vermasselt habe – jetzt, wenn du ein Proj1 Repo klonen willst, machst du es mit proj1.github.com (genau dem Host aus der Konfigurationsdatei). git clone git@proj1.github.com .

    Ein gutes Tutorial.

    Verwechsle nicht die Gastgeber

    Ich benutzte,

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

    Es wusch gut.

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

    Als Ergänzung der Antwort von @stefano ist es besser, den Befehl mit -f wenn ein neuer SSH-Schlüssel für ein anderes Konto erstellt wird.

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

    Da id_rsa_work Datei nicht existiert in Pfad ~/.ssh/ , und ich erstelle diese Datei manuell, und es funktioniert nicht 🙁

    Ich benutze Shell-Skripte, um mich zu jedem Account zu schalten, der “aktiv” sein soll. Im Wesentlichen starten Sie von einem Neuanfang, erhalten ein Konto richtig konfiguriert und arbeiten, dann verschieben Sie diese Dateien auf einen Namen mit dem richtigen Präfix. Von da an können Sie mit dem Befehl “github” oder “gitxyz” wechseln:

     # 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 "dhoerl@xyz.com" git config --global github.user "dhoerl" # git config --global github.token "whatever_it_is" # now unused ssh-add -D 

    Ich hatte großes Glück damit. Ich habe auch ein Laufskript in Xcode erstellt (für Mac-Benutzer), so dass es mein Projekt nicht erstellen würde, wenn ich nicht die richtige Einstellung (seit der Verwendung von git) hätte:

    Run Script nach Abhängigkeiten platziert:

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

    Eine möglicherweise einfachere Alternative zum Bearbeiten der ssh-Konfigurationsdatei (wie in allen anderen Antworten vorgeschlagen) besteht darin, ein einzelnes Repository so zu konfigurieren, dass es einen anderen (z. B. nicht standardmäßigen) SSH-Schlüssel verwendet.

    Führen Sie im 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 zum ssh-agent hinzugefügt wird, indem Sie Folgendes ausführen:

     ssh-add ~/.ssh/id_rsa_anotheraccount 

    Beachten Sie, dass der obige Befehl dem ssh-agent nur für Ihre aktuelle Sitzung einen Schlüssel hinzufügt. Wenn dies funktioniert, müssen Sie es “permanent” zu Ihrem ssh-agent hinzufügen. ZB hier ist, wie es für Ubuntu und hier für OSX getan wird.

    Es sollte auch möglich sein, diesen Ansatz auf mehrere Repositories zu skalieren, indem globale git config und bedingte includes verwendet werden ( siehe Beispiel ).