Nabierać formy
Aby zarządzać repozytorium git pod osobnym kontem github / bitbucket / cokolwiek, wystarczy wygenerować nowy klucz SSH.
Ale zanim zaczniemy pchanie / ciągnięcie repo z drugiej tożsamości, muszę się dostać się do kształtu - załóżmy, Twój system jest skonfigurowany z typowym id_rsa
i id_rsa.pub
pary kluczy. W tej chwili twój tree ~/.ssh
wygląd wygląda tak
$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── id_rsa
└── id_rsa.pub
Najpierw nazwij tę parę kluczy - dodanie opisowej nazwy pomoże ci zapamiętać, który klucz jest używany dla danego użytkownika / pilota
# change to your ~/.ssh directory
$ cd ~/.ssh
# rename the private key
$ mv id_rsa github-mainuser
# rename the public key
$ mv id_rsa.pub github-mainuser.pub
Następnie wygenerujmy nową parę kluczy - tutaj nazwiemy nowy kluczgithub-otheruser
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/github-otheruser
Teraz, kiedy patrzymy tree ~/.ssh
, widzimy
$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── github-mainuser
├── github-mainuser.pub
├── github-otheruser
└── github-otheruser.pub
Następnie musimy ustawić ~/.ssh/config
plik, który zdefiniuje nasze kluczowe konfiguracje. Stworzymy go z odpowiednimi uprawnieniami tylko do odczytu / zapisu właściciela
$ (umask 077; touch ~/.ssh/config)
Otwórz to za pomocą swojego ulubionego edytora i dodaj następującą zawartość
Host github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
Przypuszczalnie będziesz mieć kilka istniejących repozytoriów powiązanych z twoją podstawową tożsamością github. Z tego powodu „domyślny” github.com Host
jest skonfigurowany do używania twojego mainuser
klucza. Jeśli nie chcesz faworyzować jednego konta nad drugim, pokażę ci, jak zaktualizować istniejące repozytoria w systemie, aby użyć zaktualizowanej konfiguracji ssh.
Dodaj nowy klucz SSH do github
Wejdź na github.com/settings/keys, aby dodać nowy klucz publiczny
Możesz pobrać zawartość klucza publicznego za pomocą: skopiuj / wklej ją do github
$ cat ~/.ssh/github-otheruser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBVvWNQ2nO5...
Teraz twoja nowa tożsamość użytkownika jest skonfigurowana - poniżej pokażemy ci, jak z niej korzystać.
Wykonanie rzeczy: klonowanie repozytorium
Więc jak to działa w połączeniu z git i github? Ponieważ nie możesz mieć kurczaka i jajka, przyjrzymy się klonowaniu istniejącego repozytorium. Ta sytuacja może dotyczyć Ciebie, jeśli masz nowe konto github dla swojego miejsca pracy i zostałeś dodany do projektu firmowego.
Powiedzmy, że github.com/someorg/somerepo
już istnieje i zostałeś do tego dodany - klonowanie jest tak proste, jak
$ git clone github.com-otheruser:someorg/somerepo.git
Ta pogrubiona część musi być zgodna z Host
nazwą, którą ustawiliśmy w twoim ~/.ssh/config
pliku. To poprawnie łączy git z odpowiednim IdentityFile
i poprawnie uwierzytelnia cię w github
Zadania: tworzenie nowego repozytorium
Ponieważ nie możesz mieć kurczaka i jajka, przyjrzymy się opublikowaniu nowego repozytorium na Twoim drugim koncie. Ta sytuacja dotyczy użytkowników, którzy tworzą nowe treści przy użyciu dodatkowego konta github.
Załóżmy, że wykonałeś już trochę pracy lokalnie i jesteś teraz gotowy, aby przejść na github. Możesz iść ze mną, jeśli chcesz
$ cd ~
$ mkdir somerepo
$ cd somerepo
$ git init
Teraz skonfiguruj to repozytorium, aby używać swojej tożsamości
$ git config user.name "Mister Manager"
$ git config user.email "someuser@some.org"
Teraz dokonaj pierwszego zatwierdzenia
$ echo "hello world" > readme
$ git add .
$ git commit -m "first commit"
Sprawdź zatwierdzenie, aby zobaczyć, że nowa tożsamość została użyta za pomocą git log
$ git log --pretty="%H %an <%ae>"
f397a7cfbf55d44ffdf87aa24974f0a5001e1921 Mister Manager <someuser@some.org>
W porządku, czas naciskać na github! Ponieważ github jeszcze nie wie o naszym nowym repozytorium, najpierw wejdź na github.com/new i utwórz nowe repozytorium - nazwij je kiedyś
Teraz, aby skonfigurować twoje repozytorium do „rozmowy” z github przy użyciu poprawnej tożsamości / poświadczeń, dodaliśmy pilota. Zakładając, że nazwa użytkownika github dla nowego konta to someuser
...
$ git remote add origin github.com-otheruser:someuser/somerepo.git
Ta pogrubiona część jest absolutnie krytyczna i musi pasować do Host
zdefiniowanej w twoim ~/.ssh/config
pliku
Na koniec wypchnij repozytorium
$ git push origin master
Zaktualizuj istniejące repozytorium, aby użyć nowej konfiguracji SSH
Załóżmy, że masz już kilka sklonowanych repozytoriów, ale teraz chcesz użyć nowej konfiguracji SSH. W powyższym przykładzie, my zachowaliśmy istniejące repo w takt przypisując poprzednią id_rsa
/ id_rsa.pub
pary kluczy do Host github.com
zapisania w pliku konfiguracyjnym SSH. Nie ma w tym nic złego, ale mam teraz co najmniej 5 konfiguracji github i nie lubię myśleć o jednej z nich jako o konfiguracji „domyślnej” - wolałbym wyraźnie mówić o każdej z nich.
Zanim to mieliśmy
Host github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
Zaktualizujemy to do tego (zmiany pogrubione )
Host github.com-mainuser
HostName github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
Ale to oznacza, że teraz żadne istniejące repo z github.com
pilotem nie będzie już działać z tym plikiem tożsamości. Ale nie martw się, to prosta poprawka.
Aby zaktualizować istniejące repozytorium w celu korzystania z nowej konfiguracji SSH, wystarczy otworzyć plik konfiguracyjny git repo i zaktualizować adres URL!
$ cd existingrepo
$ nano .git/config
Zaktualizuj pole zdalnego pochodzenia (zmiany pogrubione )
[remote "origin"]
url = github.com-mainuser:someuser/existingrepo.git
fetch = +refs/heads/*:refs/remotes/origin/*
Otóż to. Teraz możesz push
/ pull
do zadowolenia swojego serca
Uprawnienia do pliku kluczy SSH
Jeśli masz problemy z nieprawidłowym działaniem kluczy publicznych, SSH ściśle przestrzega uprawnień do plików w ~/.ssh
katalogu i odpowiednich plikach kluczy
Zasadniczo powinny istnieć wszystkie katalogi 700
i wszystkie pliki 600
- oznacza to, że są one tylko do odczytu / zapisu przez właściciela - żadna inna grupa / użytkownik nie może ich odczytać / zapisać
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/config
$ chmod 600 ~/.ssh/github-mainuser
$ chmod 600 ~/.ssh/github-mainuser.pub
$ chmod 600 ~/.ssh/github-otheruser
$ chmod 600 ~/.ssh/github-otheruser.pub
Jak zarządzam kluczami SSH
Zarządzam osobnymi kluczami SSH dla każdego hosta, z którym się łączę, tak że jeśli jakiś klucz zostanie kiedykolwiek naruszony, nie muszę aktualizować kluczy w każdym innym miejscu, w którym użyłem tego klucza. To tak, jak gdy otrzymujesz powiadomienie od Adobe, że 150 milionów informacji o ich użytkownikach zostało skradzionych - teraz musisz anulować tę kartę kredytową i zaktualizować każdą zależną od niej usługę - co za uciążliwość.
Oto ~/.ssh
jak wygląda mój katalog: Mam jeden .pem
klucz dla każdego użytkownika w folderze dla każdej domeny, z którą się łączę. Używam .pem
kluczy, więc potrzebuję tylko jednego pliku na klucz.
$ tree ~/.ssh
/Users/naomik/.ssh
├── config
├── github.com
│ ├── naomik.pem
│ ├── someusername.pem
├── known_hosts
├── naomi.makes.software
│ ├── naomi.pem
├── somedomain.com
│ ├── someuser.pem
└── someotherdomain.org
└── someuser.pem
A oto mój odpowiedni /.ssh/config
plik - oczywiście github ma znaczenie, aby odpowiedzieć na to pytanie dotyczące github, ale ta odpowiedź ma na celu wyposażyć cię w wiedzę na temat zarządzania twoją tożsamością ssh na dowolnej liczbie usług / maszyn.
Host github.com-naomik
HostName github.com
User git
IdentityFile ~/.ssh/github.com/naomik.pem
Host github.com-someuser
HostName github.com
User git
IdentityFile ~/.ssh/github.com/someusername.pem
Host naomi.makes.software
User naomi
IdentityFile ~/.ssh/naomi.makes.software/naomi.pem
Host somedomain.com
HostName 162.10.20.30
User someuser
IdentityFile ~/.ssh/somedomain.com/someuser.pem
Host someotherdomain.org
User someuser
IdentityFile ~/.ssh/someotherdomain.org/someuser.pem
Pobieranie klucza publicznego SSH z klucza PEM
Powyżej zauważyłeś, że dla każdego klucza mam tylko jeden plik. Kiedy muszę podać klucz publiczny, po prostu generuję go w razie potrzeby.
Więc kiedy github poprosi o klucz publiczny ssh, uruchom to polecenie, aby wypisać klucz publiczny na standardowe wyjście - skopiuj / wklej w razie potrzeby
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAA...
Uwaga: jest to również ten sam proces, którego używam do dodawania mojego klucza do dowolnego zdalnego komputera. ssh-rsa AAAA...
Wartość jest kopiowana do pilota ~/.ssh/authorized_keys
pliku
Konwersja par id_rsa
/ id_rsa.pub
kluczy do formatu PEM
Więc chcesz oswoić swoje kluczowe pliki i ograniczyć niektóre cruft systemu plików? Przekształcenie pary kluczy w pojedynczy PEM jest łatwe
$ cd ~/.ssh
$ openssl rsa -in id_rsa -outform pem > id_rsa.pem
Lub, podążając za powyższymi przykładami, zmieniliśmy nazwę id_rsa -> github-mainuser
i id_rsa.pub -> github-mainuser.pub
- tak
$ cd ~/.ssh
$ openssl rsa -in github-mainuser -outform pem > github-mainuser.pem
Teraz, aby upewnić się, że przekonwertowaliśmy to poprawne, musisz sprawdzić, czy wygenerowany klucz publiczny pasuje do twojego starego klucza publicznego
# display the public key
$ cat github-mainuser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
# generate public key from your new PEM
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
Teraz, gdy masz już github-mainuser.pem
plik, możesz bezpiecznie usunąć stary github-mainuser
i github-mainuser.pub
pliki - potrzebny jest tylko plik PEM; po prostu wygeneruj klucz publiczny, kiedy go potrzebujesz ^ _ ^
Tworzenie kluczy PEM od podstaw
Nie musisz tworzyć pary klucz prywatny / publiczny, a następnie konwertować na pojedynczy klucz PEM. Możesz utworzyć klucz PEM bezpośrednio.
Stwórzmy newuser.pem
$ openssl genrsa -out ~/.ssh/newuser.pem 4096
Uzyskanie klucza publicznego SSH jest takie samo
$ ssh-keygen -y -f ~/.ssh/newuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACA ... FUNZvoKPRQ==
ssh-add ~/.ssh/id_rsa_COMPANY
<br/> aby poinformować ssh-agenta, aby podał go do użycia. <hr /> Rest działa dla mnie dobrze z wyżej wymienionym samouczkiem.