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]:accountname
powinny używać id_rsa
i [email protected]:anotheraccount
powinny być używane id_rsa_anotheraccount
.
git pull
nie 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 wssh-add -l
… Klucz uni był „pierwszy” niezależnie od tego ustawienia. Musiałem przenieść jego sekcję poniżej innych w .ssh / config, a terazgit pull
z obu GitHub accts udaje się bez pytania o hasło uni ssh.Odpowiedzi:
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/config
był mniej więcej następujący: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
źródło
ssh-add
tego mi brakowało.IdentitiesOnly yes
doHost *
sekcji~/.ssh/config
pliku. To mówi ssh, aby faktycznie używał określonych plików tożsamości, zamiast spamować serwer wszystkimi z nich.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”:
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”:
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:
Jeśli twoich wpisów tam nie ma, uruchom:
Krok 4: test
Aby przetestować, czy wszystko wykonałeś poprawnie, proponuję następujące szybkie sprawdzenie:
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! :)
źródło
Załóżmy, że
alice
jest użytkownikiem github.com z 2 lub więcej prywatnymi repozytoriamirepoN
. W tym przykładzie będziemy pracować tylko z dwoma repozytoriami o nazwachrepo1
irepo2
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 master
na 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/config
plik, 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: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/config
pliku repozytorium i zmodyfikowałeś adres URL swojego pilota tak,origin
aby wyglądał mniej więcej tak:I w końcu poszedłeś do
Settings > Deploy keys
sekcji repozytorium i dodałeś zawartośćalice_github.id_rsa.pub
W tym momencie możesz zrobić to
git pull origin master
bez wprowadzania hasła bez problemu.ale co z drugim repozytorium?
Instynkt
repo2
polega 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
repo2
konfiguracji 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.com
domenie?Twój
.ssh/config
plik wskazujegithub.com
i 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.com
irepo2.github.com
Pierwszą rzeczą jest edycja
.git/config
plików na klonach repo, więc zamiast tego wyglądają tak:Do repo1
Do repo2
A potem w
.ssh/config
pliku będziesz mógł wprowadzić konfigurację dla każdej subdomeny :)Teraz możesz to zrobić
git pull origin master
bez 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.
źródło
.ssh/config
jest kluczowym krokiem - wielkie dzięki za toMam 2 konta na github i oto, co zrobiłem (na
linux
), aby działało.Klucze
ssh-keygen
, nazwij je poprawnie, aby ułatwić życie.ssh-add path_to_private_key
Konfiguracja
~ / .ssh / config
Ustaw zdalny adres URL repo:
W przypadku repozytorium w hoście
github-kc
:W przypadku repozytorium w hoście
github-abc
:Wyjaśnienie
Opcje w
~/.ssh/config
:Host
github- <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-kc
zidentyfikować 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
Host
]Hostname
podaj rzeczywistą nazwę hosta, po prostu użyj
github.com
dla github,User
gitużytkownik jest zawsze
git
dla 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,
DEBUG3
daje najbardziej szczegółowe informacje.źródło
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.ssh-add
ponieważ twoje klucze nie są chronione hasłem lub (jeśli używasz komputera Mac) brelok OSX obsługuje go za Ciebie.ssh-add
Zapobiega konieczności wprowadzania hasła za każdym razem, gdy uzyskujesz dostęp do swoich kluczy.Użyj
IdentityFile
parametru w~/.ssh/config
:źródło
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:
I upewnij się, że twój klucz został dodany do ssh-agent, uruchamiając:
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 ).
źródło
Spędziłem dużo czasu, aby zrozumieć wszystkie kroki. Opiszmy więc krok po kroku:
ssh-keygen -t rsa
. Daj mu alternatywęproj1.id_rsa
i bez wątpienia uderz, ponieważ nie potrzebujesz hasła.Dodaj nową sekcję w
.ssh/config
:Weź pod uwagę pierwszą sekcję i pamiętaj,
proj1.github.com
że wrócimy do niej później.ssh-add ~/.ssh/proj1.id_rsa
proj1.github.com
(dokładnie hosta z pliku konfiguracyjnego).git clone [email protected]
.Dobry samouczek.
Nie zadzieraj z hostami
źródło
id_rsa_proj1
iproj1_id_rsa
powinny być takie same. Możesz także dodać do odpowiedzi część dotyczącą.git/config
ustawień z samouczka.proj1.id_rsa
vs.proj1_id_rsa
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:
Wygeneruj parę kluczy za pomocą ssh-keygen pokazanego poniżej. Wygeneruje parę kluczy (w tym przykładzie
.\keyfile
i.\keyfile.pub
)ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile
Prześlij
keyfile.pub
do dostawcy gitps -ef | grep ssh-agent
czy już działa)ssh-add .\keyfile
aby dodać poświadczeniagit clone git@provider:username/project.git
źródło
Użyłem,
Brzmiało dobrze.
Użyj powyższego ustawienia w pliku .ssh / config dla różnych kluczy rsa dla różnych nazw użytkowników.
źródło
Jako uzupełnienie odpowiedzi @stefano, lepiej jest użyć polecenia
-f
przy generowaniu nowego klucza SSH dla innego konta,Ponieważ
id_rsa_work
plik nie istnieje w ścieżce~/.ssh/
, a ja tworzę ten plik ręcznie i nie działa :(źródło
Tutaj umieściłem technikę, z którą sobie radzę
źródło