Wiele kont GitHub i konfiguracja SSH

249

Mam problem z uzyskaniem dwóch różnych kluczy SSH / kont GitHub, aby dobrze ze sobą grać. Mam następującą konfigurację:

Repozytoria dostępne z jednego konta za pomocą [email protected]:accountname

Repozytoria dostępne z innego konta za pomocą [email protected]:anotheraccount

Każde konto ma własny klucz SSH. Dodano oba klucze SSH i utworzyłem plik konfiguracyjny. Nie sądzę jednak, aby plik konfiguracyjny był poprawny. Nie jestem do końca pewien, jak określić, które repo, do których uzyskiwany jest dostęp, [email protected]:accountnamepowinny używać id_rsai [email protected]:anotheraccountpowinny być używane id_rsa_anotheraccount.

radesix
źródło
Uważam, że ten link jest pomocny medium.freecodecamp.org/…
jgreen 18.04.19
Mam 3 oddzielne tożsamości SSH w ~ / .ssh / config. Ten do serwera szkolnego ma hasło; 2 dla oddzielnej pracy / osobistych działań GitHub nie. Uruchomienie git pullnie powiodło się i prośba o podanie szkolnego hasła, pomimo osobnych plików tożsamości, „IdentitiesOnly = yes”, oddzielnych domen i nazw hostów, wszystkie obecne w ssh-add -l… Klucz uni był „pierwszy” niezależnie od tego ustawienia. Musiałem przenieść jego sekcję poniżej innych w .ssh / config, a teraz git pullz obu GitHub accts udaje się bez pytania o hasło uni ssh.
mc01,

Odpowiedzi:

309

Odpowiedź Andy'ego Lestera jest trafna, ale znalazłem ważny dodatkowy krok, który musiałem zrobić, aby to zadziałało. Próbując skonfigurować dwa profile, jeden do osobistego i jeden do pracy, mój ~/.ssh/configbył mniej więcej następujący:

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

Mój profil do pracy nie trwał, dopóki nie zrobiłem ssh-add ~/.ssh/work_rsa. Następnie połączenia z githubem używały prawidłowego profilu. Wcześniej domyślnie używano pierwszego klucza publicznego.

Aby nie można otworzyć połączenia z agentem uwierzytelniającym podczas korzystania ssh-add,
sprawdź: https://stackoverflow.com/a/17695338/1760313

Jim Wrubel
źródło
39
Dzięki! - ssh-addtego mi brakowało.
mędrzec
Korzystając z ssh-add, mogłem zobaczyć, że nie mam uprawnień do plików dla zestawu kluczy poprawnie. Kiedyś naprawiłem, że wszystko działało. Więc dziękuję!
phatmann
6
Zobacz także doblock.com/articles/… . Kluczową nową informacją jest to, że może być konieczne dodanie nazwy użytkownika (w tym przykładzie „praca”) do nazwy hosta w zdalnym adresie URL, tj. [email protected]: work / my_repo.git (as w przeciwieństwie do „[email protected] ...”)
BobS
15
Aby rozwiązać problem polegający na tym, że „domyślnie używają pierwszego klucza publicznego”, dodaj IdentitiesOnly yesdo Host *sekcji ~/.ssh/configpliku. To mówi ssh, aby faktycznie używał określonych plików tożsamości, zamiast spamować serwer wszystkimi z nich.
Ślimak mechaniczny
172

Niedawno musiałem to zrobić i musiałem przejrzeć wszystkie te odpowiedzi i ich komentarze, aby ostatecznie zebrać informacje razem, dlatego umieszczę to wszystko tutaj, w jednym poście, dla Twojej wygody:


Krok 1: Klucze SSH
Utwórz potrzebne pary kluczy . W tym przykładzie nazwałem mnie domyślnym / oryginalnym „id_rsa” (który jest domyślny) i moim nowym „id_rsa-work”:

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


Krok 2:
Konfiguracja ssh Skonfiguruj wiele profili ssh, tworząc / modyfikując ~ / .ssh / config . Zwróć uwagę na nieco różniące się wartości „Host”:

# 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


Krok 3: Dodaj ssh
Możesz to zrobić lub nie. Aby to sprawdzić, wyświetl listę odcisków palców tożsamości, uruchamiając:

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

Jeśli twoich wpisów tam nie ma, uruchom:

ssh-add ~/.ssh/id_rsa_work


Krok 4: test
Aby przetestować, czy wszystko wykonałeś poprawnie, proponuję następujące szybkie sprawdzenie:

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

Pamiętaj, że musisz zmienić nazwę hosta (github / work.github) w zależności od tego, jakiego klucza / tożsamości chcesz użyć. Ale teraz powinieneś być gotowy! :)

Stefan
źródło
1
To świetna odpowiedź. Musiałem użyć ssh-add, aby dodać oba klucze ssh, aby wykorzystać plik konfiguracyjny .. Dzięki :)
gaurav.singharoy
Jedyne, co lubię dodawać, to kiedy uruchomisz ssh-keygen -t rsa, poda ci domyślną nazwę pliku, czyli tam, gdzie wpisujesz swoją niestandardową nazwę.
Donato,
Jedna z najlepszych odpowiedzi. Pomogło mi także to wideo. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif
Dobry post, byłoby miło, gdyby ten post zawierał ustawienie e-maila w konfiguracji git: help.github.com/articles/…
Dave Engineer
43

Załóżmy, że alicejest użytkownikiem github.com z 2 lub więcej prywatnymi repozytoriami repoN. W tym przykładzie będziemy pracować tylko z dwoma repozytoriami o nazwach repo1irepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Musisz pobierać z tych repozytoriów bez wprowadzania haseł prawdopodobnie na serwerze lub na wielu serwerach. Chcesz git pull origin masterna przykład wykonać i chcesz, aby tak się stało bez pytania o hasło.

Nie lubisz zajmować się agentem ssh, odkryłeś (lub odkrywasz teraz) ~/.ssh/configplik, który pozwala Twojemu klientowi ssh wiedzieć, jakiego klucza prywatnego użyć w zależności od nazwy hosta i nazwy użytkownika, z prostym wpisem konfiguracji, który wygląda jak to:

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

Więc poszedłeś naprzód i stworzyłeś (alice_github.id_rsa, alice_github.id_rsa.pub)parę kluczy, następnie również poszedłeś do .git/configpliku repozytorium i zmodyfikowałeś adres URL swojego pilota tak, originaby wyglądał mniej więcej tak:

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

I w końcu poszedłeś do Settings > Deploy keyssekcji repozytorium i dodałeś zawartośćalice_github.id_rsa.pub

W tym momencie możesz zrobić to git pull origin masterbez wprowadzania hasła bez problemu.

ale co z drugim repozytorium?

Instynkt repo2polega więc na złapaniu tego klucza i dodaniu go do kluczy Wdróż, ale github.com popełni błąd i powie, że klucz jest już używany.

Teraz idź i wygeneruj kolejny klucz ( ssh-keygen -t rsa -C "[email protected]"oczywiście bez użycia haseł), a żeby to nie stało się bałaganem, teraz nadasz swoim kluczom następujące nazwy:

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

Teraz umieścisz nowy klucz publiczny w repo2konfiguracji Wdróż klucze na github.com, ale teraz masz problem z ssh do rozwiązania.

W jaki sposób ssh może określić, którego klucza użyć, jeśli repozytoria są hostowane w tej samej github.comdomenie?

Twój .ssh/configplik wskazuje github.comi nie wie, którego klucza użyć, gdy nadejdzie czas, aby wykonać ściąganie.

Więc znalazłem sztuczkę z github.com. Możesz powiedzieć klientowi ssh, że każde repozytorium mieszka w innej subdomenie github.com, w takich przypadkach będą one repo1.github.comirepo2.github.com

Pierwszą rzeczą jest edycja .git/configplików na klonach repo, więc zamiast tego wyglądają tak:

Do repo1

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

Do repo2

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

A potem w .ssh/configpliku będziesz mógł wprowadzić konfigurację dla każdej subdomeny :)

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

Teraz możesz to zrobić git pull origin masterbez wprowadzania haseł z obu repozytoriów.

Jeśli masz wiele komputerów, możesz skopiować klucze do każdego z nich i użyć ich ponownie, ale radzę wykonać pracę nóg, aby wygenerować 1 klucz na maszynę i repozytorium. Będziesz miał o wiele więcej kluczy do obsługi, ale będziesz mniej podatny na ataki, jeśli ktoś zostanie przejęty.

Gubatron
źródło
1
Określenie poddomeny pasującej do hosta .ssh/configjest kluczowym krokiem - wielkie dzięki za to
Mike Miller
22

Mam 2 konta na github i oto, co zrobiłem (na linux), aby działało.

Klucze

  • Utwórz 2 pary kluczy rsa, za pomocą ssh-keygen, nazwij je poprawnie, aby ułatwić życie.
  • Dodaj klucze prywatne do lokalnego agenta za pośrednictwem ssh-add path_to_private_key
  • Do każdego konta github prześlij (odrębny) klucz publiczny.

Konfiguracja

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

Ustaw zdalny adres URL repo:

  • W przypadku repozytorium w hoście github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • W przypadku repozytorium w hoście github-abc:

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

Wyjaśnienie

Opcje w ~/.ssh/config:

  • Hostgithub- <identify_specific_user>
    Host może być dowolną wartością, która może identyfikować hosta plus konto, nie musi być prawdziwym hostem, np. github-kczidentyfikować jedno z moich kont na github dla mojego lokalnego laptopa,

    Po ustawieniu zdalnego adresu URL dla repozytorium git, jest to wartość, którą należy wprowadzić git@, tak repo mapuje się na hosta, np.git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [Poniżej znajdują się opcje podrzędne Host]
  • Hostname
    podaj rzeczywistą nazwę hosta, po prostu użyj github.comdla github,
  • Usergit
    użytkownik jest zawsze gitdla github,
  • IdentityFile
    podaj klucz do użycia, po prostu podaj ścieżkę do klucza publicznego,
  • LogLevel
    Określ poziom dziennika do debugowania, jeśli występuje problem, DEBUG3daje najbardziej szczegółowe informacje.

Eric Wang
źródło
piękny - nie potrzebowałem ssh-add path_to_private_key- prawdopodobnie dlatego, że agent nie jest w tym przypadku wymagany. Plik konfiguracyjny wyraźnie określa ścieżkę do kluczy.
Mark Chackerian
2
@MarkChackerian Myślę, że nie potrzebujesz, ssh-addponieważ twoje klucze nie są chronione hasłem lub (jeśli używasz komputera Mac) brelok OSX obsługuje go za Ciebie. ssh-addZapobiega konieczności wprowadzania hasła za każdym razem, gdy uzyskujesz dostęp do swoich kluczy.
Ashhar Hasan,
18

Użyj IdentityFileparametru w ~/.ssh/config:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance
Andy Lester
źródło
Dzięki, ale to nie jest całkiem dokładne. Znalazłem odpowiedź i udostępniłem poniżej.
radesix,
Jestem prawie pewien, że moje podejście zadziała w twoim przypadku. Możesz zidentyfikować różnych użytkowników i różne pliki tożsamości. Wystarczy podać każdemu inny parametr Host w sekcji konfiguracji.
Andy Lester,
1
Andy, zgodnie z linkiem, który znalazłem poniżej, musiałem upuścić domenę .com z hosta. Kiedy to zrobiłem, działało dobrze.
radesix,
5

Prawdopodobnie prostszą alternatywą dla edycji pliku konfiguracyjnego ssh (jak sugerowano we wszystkich innych odpowiedziach) jest skonfigurowanie indywidualnego repozytorium, aby używało innego (np. Domyślnego) klucza ssh.

W repozytorium, dla którego chcesz użyć innego klucza, uruchom:

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

I upewnij się, że twój klucz został dodany do ssh-agent, uruchamiając:

ssh-add ~/.ssh/id_rsa_anotheraccount

Należy pamiętać, że powyższe polecenie doda tylko klucz do agenta ssh dla bieżącej sesji. Jeśli chcesz, aby działało to wiecznie, musisz „na stałe” dodać to do swojego agenta ssh. Np. Oto jak to zrobić dla Ubuntu i tutaj dla OSX .

Powinno być również możliwe skalowanie tego podejścia do wielu repozytoriów przy użyciu globalnej konfiguracji git i dołączeń warunkowych ( patrz przykład ).

Jakub Kukul
źródło
4

Spędziłem dużo czasu, aby zrozumieć wszystkie kroki. Opiszmy więc krok po kroku:

  1. Utwórz nowy plik tożsamości za pomocą ssh-keygen -t rsa. Daj mu alternatywę proj1.id_rsai bez wątpienia uderz, ponieważ nie potrzebujesz hasła.
  2. Dodaj nową sekcję w .ssh/config:

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

Weź pod uwagę pierwszą sekcję i pamiętaj, proj1.github.comże wrócimy do niej później.

  1. Dodaj tożsamość do agenta ssh ssh-add ~/.ssh/proj1.id_rsa
  2. Właśnie to zawiodłem po raz pierwszy - teraz, gdy chcesz sklonować repozytorium proj1, robisz to za pomocą proj1.github.com(dokładnie hosta z pliku konfiguracyjnego). git clone [email protected].

Dobry samouczek.

Nie zadzieraj z hostami

I159
źródło
Dzięki za link do turorialu! Masz literówkę: nazwy klawiszy id_rsa_proj1i proj1_id_rsapowinny być takie same. Możesz także dodać do odpowiedzi część dotyczącą .git/configustawień z samouczka.
cezar
Nadal masz literówkę: proj1.id_rsavs.proj1_id_rsa
cezar
3

W moim przypadku żadne z powyższych rozwiązań nie rozwiązało mojego problemu, ale robi to ssh-agent. Zasadniczo wykonałem następujące czynności:

  1. Wygeneruj parę kluczy za pomocą ssh-keygen pokazanego poniżej. Wygeneruje parę kluczy (w tym przykładzie .\keyfilei .\keyfile.pub)

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

  2. Prześlij keyfile.pubdo dostawcy git

  3. Uruchom ssh-agent na swoim komputerze (możesz sprawdzić za pomocą, ps -ef | grep ssh-agentczy już działa)
  4. Uruchom, ssh-add .\keyfileaby dodać poświadczenia
  5. Teraz możesz biegać git clone git@provider:username/project.git
Berniey
źródło
2

Użyłem,

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

Brzmiało dobrze.

Użyj powyższego ustawienia w pliku .ssh / config dla różnych kluczy rsa dla różnych nazw użytkowników.

Jyoti Prakash
źródło
2

Jako uzupełnienie odpowiedzi @stefano, lepiej jest użyć polecenia -fprzy generowaniu nowego klucza SSH dla innego konta,

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

Ponieważ id_rsa_workplik nie istnieje w ścieżce ~/.ssh/, a ja tworzę ten plik ręcznie i nie działa :(

li2
źródło
2

Tutaj umieściłem technikę, z którą sobie radzę

David H.
źródło