it-swarm.com.de

Mehrere GitHub-Konten und SSH-Konfig

Ich habe Probleme, zwei verschiedene SSH-Schlüssel/GitHub-Konten zu erhalten, um gut zusammen zu spielen. Ich habe das folgende Setup:

Repos, die von einem Konto aus mit [email protected]:accountname erreichbar sind

Mit [email protected]:anotheraccount von einem anderen Konto aus erreichbare Repos

Jedes Konto verfügt über 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 [email protected]:accountname zugegriffen wird, id_rsa und [email protected]:anotheraccountid_rsa_anotheraccount verwenden sollen. 

229
radesix

Andy Lesters Antwort ist genau, aber ich fand einen wichtigen zusätzlichen Schritt, den ich machen musste, damit dies funktioniert. Beim Versuch, zwei Profile einzurichten, eines für das persönliche und eines für die Arbeit, lautete mein ~/.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 nahm nicht an, bis ich einen ssh-add ~/.ssh/work_rsa erstellt hatte. Danach verwendeten die Verbindungen zu github das richtige Profil. Bisher wurde der erste öffentliche Schlüssel verwendet.

Zum Verbindung zu Ihrem Authentifizierungsagenten konnte nicht hergestellt werden bei Verwendung von ssh-add
überprüfen Sie: https://stackoverflow.com/a/17695338/1760313

291
Jim Wrubel

Ich musste dies kürzlich tun und musste all diese Antworten und ihre Kommentare durchsehen, um die Informationen schließlich zusammenzusetzen. Daher werde ich alles hier in einem Beitrag für Ihre Bequemlichkeit zusammenstellen:


Schritt 1: SSH-Tasten  
Erstellen Sie alle Schlüsselpaare, die Sie benötigen. In diesem Beispiel habe ich mir Standard/Original 'id_rsa' (was der Standard ist) und meinen neuen 'id_rsa-work' genannt:

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


Schritt 2: ssh config  
Richten Sie mehrere ssh-Profile ein, indem Sie ~/.ssh/config erstellen/ändern. Beachten Sie die etwas unterschiedlichen '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 nicht tun. Um zu überprüfen, listen Sie 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 [email protected] (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 [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.

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

158
stefano

Angenommen, alice ist ein Benutzer von github.com mit 2 oder mehr privaten Repositorys repoN. In diesem Beispiel arbeiten wir mit nur zwei Repositorys namens repo1 und repo2.

https://github.com/alice/repo1

https://github.com/alice/repo2

Sie müssen aus diesen Repositorys abrufen, ohne ein Kennwort eingeben zu müssen, wahrscheinlich auf einem Server oder auf mehreren Servern. Sie möchten beispielsweise git pull Origin master ausführen, und Sie möchten, dass dies geschieht, ohne nach einem Kennwort zu fragen.

Sie haben keine Lust mit ssh-agent zu tun, Sie haben (oder entdecken gerade) eine ~/.ssh/config-Datei entdeckt, die Ihren ssh-Client wissen lässt, welcher private Schlüssel abhängig von Hostname und Benutzername verwendet werden soll, mit einem einfachen Konfigurationseintrag so was:

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, dann auch die .git/config-Datei Ihres Repositorys aufgerufen und die URL Ihrer entfernten Origin so geändert, dass sie etwa so aussieht:

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

Und schließlich haben Sie den Abschnitt Settings > Deploy keys des Repository aufgerufen und den Inhalt von alice_github.id_rsa.pub hinzugefügt.

An dieser Stelle können Sie Ihren git pull Origin master ohne Eingabe eines Kennworts ohne Probleme ausführen.

aber was ist mit dem zweiten Repository?

Ihr Instinkt wird also darin bestehen, diesen Schlüssel zu packen und ihn den Deploy-Schlüsseln von repo2 hinzuzufügen, aber github.com gibt einen Fehler aus und teilt Ihnen mit, dass der Schlüssel bereits verwendet wird.

Jetzt generieren Sie einen weiteren Schlüssel (mit ssh-keygen -t rsa -C "[email protected]" natürlich ohne Kennwörter). Damit dies nicht zu einem Chaos wird, werden Sie Ihre 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 jetzt den neuen öffentlichen Schlüssel in repo2s Deploy keys-Konfiguration auf github.com ablegen, aber jetzt haben Sie ein SSH-Problem, mit dem Sie fertig werden müssen. 

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

Ihre .ssh/config-Datei verweist auf github.com und weiß nicht, welcher Schlüssel verwendet werden soll, wenn der Pull ausgeführt wird.

Also habe ich bei github.com einen Trick gefunden. Sie können Ihrem ssh-Client mitteilen, dass sich jedes Repository in einer anderen github.com-Subdomäne befindet. In diesen Fällen handelt es sich um repo1.github.com und repo2.github.com.

Zuerst müssen Sie die .git/config-Dateien auf Ihren Repo-Klonen bearbeiten, sodass sie stattdessen wie folgt aussehen:

Für repo1

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

Für repo2

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

Und dann können Sie jetzt in Ihrer .ssh/config-Datei eine Konfiguration für jede Subdomäne 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 master ohne Eingabe von Passwörtern aus beiden Repositorys.

Wenn Sie über mehrere Computer verfügen, können Sie die Schlüssel auf jeden Computer kopieren und wiederverwenden. Ich empfehle Ihnen jedoch, die Beinarbeit durchzuführen, um einen Schlüssel pro Computer und Repo zu generieren. Sie haben viel mehr Schlüssel, die Sie bearbeiten müssen, aber Sie sind weniger anfällig, wenn Sie gefährdet werden.

38
Gubatron

Ich habe zwei Konten auf Github, und hier habe ich (auf linux) getan, damit es funktioniert.

Schlüssel

  • Erstellen Sie 2 Paare von rsa-Schlüsseln mit ssh-keygen und benennen Sie sie richtig, damit das Leben einfacher wird.
  • Hinzufügen von privaten Schlüsseln zum lokalen Agenten über 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 in Host github-kc
    git remote set-url Origin [email protected]:kuchaguangjie/pygtrans.git
  • Für Repo in Host github-abc
    git remote set-url Origin [email protected]:abcdefg/yyy.git

Erklärung

Optionen in ~/.ssh/config:

  • Host github- <identifikationsspezifische_benutzer> 
    Der Host kann ein beliebiger Wert sein, der einen Host plus ein Konto identifizieren könnte. Es muss kein echter Host sein, Z. B github-kc identifiziere einen meiner github-Accounts für meinen lokalen laptop,

    Wenn Remote-URL für ein Git-Repo festgelegt ist, ist dies der Wert, der nach [email protected] gesetzt werden muss. So wird ein Repo einem Host zugeordnet, z. B. git remote set-url Origin [email protected]:kuchaguangjie/pygtrans.git.


  • [Nachfolgend sind Unteroptionen von Host]
  • Hostname 
    Geben Sie den tatsächlichen Hostnamen an, verwenden Sie 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. Geben Sie einfach den Pfad des öffentlichen Schlüssels ein.
  • LogLevel 
    Geben Sie den Protokollierungsgrad für das Debugging an, falls ein Problem auftritt. DEBUG3 enthält die detailliertesten Informationen.

18
Eric Wang

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

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

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

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

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

  2. Laden Sie keyfile.pub zum git-Provider hoch

  3. Starten Sie den ssh-agent auf Ihrem Rechner (Sie können mit ps -ef | grep ssh-agent nachsehen, ob er bereits läuft)
  4. Führen Sie ssh-add .\keyfile aus, um Anmeldeinformationen hinzuzufügen
  5. Jetzt können Sie git clone [email protected]:username/project.git ausführen.
2
berniey

Ich habe viel Zeit gebraucht, um 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 eine Alternative wie proj1.id_rsa ein und treffen Sie ohne Zweifel, da Sie keine Passphrase benötigen.
  2. Neuen Abschnitt in .ssh/config hinzufügen:

    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.com später zum Abschnitt zurückkehrt.

  1. Fügen Sie die Identität dem SSH-Agenten ssh-add ~/.ssh/proj1.id_rsa hinzu.
  2. Das, was ich beim ersten Mal durcheinander gebracht habe - jetzt, wenn Sie ein Proj1-Repo klonen möchten, verwenden Sie proj1.github.com (genau den Host aus der Konfigurationsdatei) .git clone [email protected].

Ein gutes Tutorial.

Mach dich nicht mit Hosts auf

2
I159

Ich verwende Shell-Skripte, um auf das Konto zu wechseln, das ich "aktiv" sein möchte. Im Wesentlichen fangen Sie mit einem Neustart an, lassen ein Konto ordnungsgemäß konfiguriert werden und arbeiten, dann verschieben Sie diese Dateien auf einen Namen mit dem richtigen Präfix. Von da an können Sie den Befehl "github" oder "gitxyz" verwenden, um zu 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 "[email protected]"
git config --global github.user "dhoerl"        
# git config --global github.token "whatever_it_is" # now unused

ssh-add -D

Ich hatte viel Glück damit. Ich habe auch ein Laufskript in Xcode (für Sie Mac-Benutzer) erstellt, damit mein Projekt nicht erstellt werden kann, wenn ich nicht die richtige Einstellung hatte (da es git verwendet):

Run Script nach Abhängigkeiten platziert:

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

Als Ergänzung der Antwort von @stefano Es ist besser, den Befehl mit -f zu verwenden, wenn Sie einen neuen SSH-Schlüssel für ein anderes Konto erstellen. 

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

Da die id_rsa_work-Datei nicht im Pfad ~/.ssh/ vorhanden ist und ich diese Datei manuell erzeuge, funktioniert sie nicht :( 

1
li2

Ich benutzte,

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

Es war gut.

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

1
Jyoti Prakash

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 ein anderer (beispielsweise nicht standardmäßiger) ssh-Schlüssel verwendet wird. 

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'

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 Schlüssel für Ihre aktuelle Sitzung hinzufügt. Wenn Sie möchten, dass dies für immer funktioniert, müssen Sie es "dauerhaft" Ihrem ssh-agent hinzufügen. Zum Beispiel, wie man es für ubuntu und hier für OSX macht.

Es sollte auch möglich sein, diesen Ansatz unter Verwendung der globalen Konfiguration von git config und der bedingten Includes ( siehe Beispiel ) auf mehrere Repositorys zu skalieren. 

0
jkukul