ssh
ma -i
opcję określenia, którego pliku klucza prywatnego użyć podczas uwierzytelniania:
-i identity_file
Wybiera plik, z którego odczytywana jest tożsamość (klucz prywatny) dla uwierzytelnienia RSA lub DSA. Domyślną wartością jest
~/.ssh/identity
dla protokołu w wersji 1, a~/.ssh/id_rsa
i~/.ssh/id_dsa
dla wersji protokołu 2. Pliki tożsamości może być również określona na zasadzie per-host w pliku konfiguracyjnym. Możliwe jest posiadanie wielu-i
opcji (i wielu tożsamości określonych w plikach konfiguracyjnych).
Czy istnieje podobny sposób na określenie, git
którego pliku klucza prywatnego użyć w systemie z wieloma kluczami prywatnymi w ~/.ssh
katalogu?
ssh
git
authentication
private-key
jrdioko
źródło
źródło
Odpowiedzi:
W
~/.ssh/config
dodaj:Teraz możesz zrobić
git clone [email protected]:username/repo.git
.UWAGA: Sprawdź, czy uprawnienia do IdentityFile wynoszą 400. SSH odrzuci, w sposób nieokreślony, klucze SSH, które są zbyt czytelne. Będzie to wyglądało jak odrzucenie poświadczenia. Rozwiązaniem w tym przypadku jest:
źródło
HostName
: Określa prawdziwą nazwę hosta, na który należy się zalogować. Można jej użyć do określenia pseudonimów lub skrótów dla hostów.” Moja wersja ssh to openssh-6.7p1.chmod 600 ~/.ssh/config
core.sshCommand
konfiguracji git. superuser.com/a/912281/162466Zmienna środowiskowa
GIT_SSH_COMMAND
:Z Gita w wersji 2.3.0 możesz używać zmiennej środowiskowej w
GIT_SSH_COMMAND
następujący sposób:Pamiętaj, że
-i
czasem plik konfiguracyjny może go zastąpić. W takim przypadku należy podać SSH pusty plik konfiguracyjny, taki jak ten:Konfiguracja
core.sshCommand
:W Git w wersji 2.10.0 możesz to skonfigurować na repo lub globalnie, więc nie musisz już ustawiać zmiennej środowiskowej!
źródło
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example"
, następniegit clone example
example=hello /usr/bin/env | grep example
./dev/null
jest prawidłową nazwą pliku w systemach operacyjnych typu UNIX, nie działa w systemie Windows.GIT_SSH_COMMAND
nie działa, aż kiedyśIdentitiesOnly
, jak tego polecenia:GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push
.Nie ma bezpośredniego sposobu na określenie,
git
którego klucza prywatnego użyć, ponieważ polega onssh
na uwierzytelnianiu repozytorium. Istnieje jednak kilka sposobów na osiągnięcie celu:Opcja 1:
ssh-agent
Możesz użyć
ssh-agent
do tymczasowej autoryzacji swojego klucza prywatnego.Na przykład:
Opcja 2:
GIT_SSH_COMMAND
Przekaż argumenty ssh przy użyciu
GIT_SSH_COMMAND
zmiennej środowiskowej (Git 2.3.0+).Na przykład:
Możesz wpisać to wszystko w jednym wierszu - zignoruj
$
i pomiń\
.Opcja 3:
GIT_SSH
Przekaż argumenty ssh za pomocą
GIT_SSH
zmiennej środowiskowej, aby określić alternatywnyssh
plik binarny.Na przykład:
Uwaga: powyższe linie to wiersze poleceń powłoki (terminala), które należy wkleić do terminala. Utworzą plik o nazwie
ssh
, sprawią, że będzie wykonywalny i (pośrednio) go uruchomią.Uwaga:
GIT_SSH
jest dostępny od wersji 0.9.4 (2005).Opcja 4:
~/.ssh/config
Użyj
~/.ssh/config
pliku zgodnie z sugestią zawartą w innych odpowiedziach, aby określić lokalizację klucza prywatnego, npźródło
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
pracował dla mnie, gdy nic innego by nie działało. Sława.~/.ssh/config
metody, wariacje env nie działały dla mnie ...GIT_SSH
jest dostępna od wersji 0.9.4 (sierpień 2005) , więc w zasadzie od czasu istnienia Git (kwiecień 2005)Napisz skrypt, który wywołuje
ssh
żądane argumenty, i umieść w nim nazwę pliku skryptu$GIT_SSH
. Lub po prostu wprowadź swoją konfigurację~/.ssh/config
.źródło
~/.ssh/config
To jest najlepsza droga.$GIT_SSH
i skrypt rozwiązały ten problem. Dzięki!Jeśli nie chcesz określać zmiennych środowiskowych za każdym razem, gdy uruchamiasz git, nie chcesz innego skryptu opakowania, nie uruchamiaj / nie możesz uruchomić ssh-agent (1), ani nie chcesz pobierać innego pakietu tylko do tego celu, użyj git -remote-ext (1) transport zewnętrzny:
Uważam to rozwiązanie za lepsze, ponieważ:
źródło
git
zasoby szefa kuchni do używania kluczy wdrażania specyficznych dla repozytorium do klonowania / pobierania z prywatnych repozytoriów Github. Dodatkową zaletą tej metody w porównaniu z metodami opartymi na środowisku / skrypcie jest to, że ponieważ ścieżka klucza jest zakodowana w konfiguracji repozytorium roboczego, użyje tego samego klucza zarówno podczas początkowego klonowania, jak i kolejnych operacji pobierania / wypychania..ssh/config
itp. +1!ext
transportu w każdym podmodule, aby rekursja w obiekcie nadrzędnym działała.fatal: transport 'ext' not allowed
, musisz dodać protokół ext do białej listy za pośrednictwemexport GIT_ALLOW_PROTOCOL=ext
. Zasadniczo pomocnik zdalnego git-remote-ext (który obsługuje adresy URL „ext :: ssh example.com% S foo / repo”) pozwala na wykonanie dowolnego polecenia. Zwykle nie stanowi to problemu, ponieważ użytkownik zawsze widzi adres URL przekazywany do git i ufa mu. Jednak podmoduły git za pośrednictwem pliku .gitmodules pozwalają osobie atakującej poprosić klienta o pobranie dowolnych adresów URL git. hackerone.com/reports/104465Użyj niestandardowej konfiguracji hosta w
~/.ssh/config
następujący sposób:użyj niestandardowej nazwy hosta w ten sposób:
źródło
Host work.github.com
HostName github.com
IdentityFile ~/.ssh/work
, a następnie zastąpić „github.com” słowem „work.github.com” za każdym razem, gdy klonuję repozytorium pracy. Nadal łączy się z „github.com”, ale używa innej niż domyślna pary kluczy.~/.ssh/config
pliku. Każda inna odpowiedź pomija sposób ustawienia hosta podczas dodawania źródła, co automatycznie pozwala gitowi na użycie poprawnego pliku klucza. DZIĘKUJĘ CI!!Po moich zmaganiach
$GIT_SSH
chciałbym podzielić się tym, co dla mnie zadziałało.Poprzez moje przykłady założę, że masz swój prywatny klucz na
/home/user/.ssh/jenkins
Błąd, którego należy unikać: wartość GIT_SSH obejmuje opcje
lub cokolwiek podobnego zawiedzie, ponieważ git spróbuje wykonać wartość jako plik . Z tego powodu musisz utworzyć skrypt.
Przykład roboczy skryptu $ GIT_SSH
/home/user/gssh.sh
Skrypt zostanie wywołany w następujący sposób:
Przykładowy działający skrypt może wyglądać następująco:
Zwróć uwagę
$*
na koniec, jest to ważna jego część.Jeszcze bezpieczniejszą alternatywą, która zapobiegłaby wszelkim możliwym konfliktom z czymkolwiek w domyślnym pliku konfiguracyjnym (oraz wyraźnym wskazaniem portu, którego należy użyć) byłoby:
Zakładając, że skrypt jest włączony
/home/user/gssh.sh
, należy:i wszystko zadziała.
źródło
Możesz po prostu użyć ssh-ident zamiast tworzyć własne opakowanie.
Możesz przeczytać więcej na: https://github.com/ccontavalli/ssh-ident
Ładuje klucze ssh na żądanie, gdy są potrzebne po raz pierwszy, nawet przy wielu sesjach logowania, xterms lub współdzielonych domach NFS.
Mały plik konfiguracyjny umożliwia automatyczne ładowanie różnych kluczy i oddzielanie ich w różnych agentach (do przekazywania agentów) w zależności od tego, co musisz zrobić.
źródło
Miałem klienta, który potrzebował osobnego konta github. Musiałem więc użyć osobnego klucza tylko do tego jednego projektu.
Moim rozwiązaniem było dodanie tego do mojego .zshrc / .bashrc:
Ilekroć chcę użyć git dla tego projektu, zastępuję „infogit” git:
Dla mnie łatwiej jest zapamiętać.
źródło
Ustawiłem więc zmienną env GIT_SSH na
$HOME/bin/git-ssh
.Aby wesprzeć konfigurację mojego repozytorium, która tożsamość ssh ma być używana, mój
~/bin/git-ssh
plik jest następujący:Następnie mam globalne ustawienie konfiguracji git:
I w dowolnym repozytorium git mogę po prostu ustawić lokalną
ssh.identity
wartość konfiguracji git:Voila!
Jeśli możesz mieć inny adres e-mail dla każdej tożsamości, staje się to jeszcze prostsze, ponieważ możesz po prostu nazwać swoje klucze po adresach e-mail, a następnie poprosić użytkownika user gain config. E-mail steruje wyborem klucza w następujący sposób
~/bin/git-ssh
:źródło
Moje rozwiązanie było następujące:
utwórz skrypt:
wtedy, gdy musisz zmienić var run:
Nie zapomnij o dodatkowej kropce !! to sprawia, że skrypt ustawia zmienne środowisk !! --key i --port są opcjonalne.
źródło
Zasadniczo chcesz do tego użyć
~/.ssh/config
. Po prostu sparuj adresy serwerów z kluczami, których chcesz użyć w następujący sposób:Host *
oznacza dowolny serwer, więc używam go~/.ssh/id_rsa
jako domyślnego klucza do użycia.źródło
Buduję na @shellholic i tym wątku SO z kilkoma teakami. Używam GitHub jako przykładu i zakładam, że masz klucz prywatny
~/.ssh/github
(w przeciwnym razie zobacz ten wątek SO ) i że dodałeś klucz publiczny do swojego profilu GitHub (w przeciwnym razie zobacz pomoc GitHub ).W razie potrzeby utwórz nowy plik konfiguracyjny SSH
~/.ssh/config
i zmień uprawnienia na 400Dodaj to do
~/.ssh/config
pliku:Jeśli masz już zdalną konfigurację, możesz ją usunąć, w przeciwnym razie nadal możesz zostać poproszony o podanie nazwy użytkownika i hasła:
Następnie dodaj zdalny do repozytorium git i zauważ dwukropek przed nazwą użytkownika:
A następnie polecenia git działają normalnie, np .:
@HeyWatch W tym wątku SO sugerowano dodanie,
IdentitiesOnly yes
aby zapobiec domyślnemu zachowaniu SSH wysyłania pliku tożsamości pasującego do domyślnej nazwy pliku dla każdego protokołu. Zobacz ten wątek, aby uzyskać więcej informacji i referencje.źródło
Wystarczy użyć
ssh-agent
issh-add
poleceń.Po wykonaniu powyższych poleceń możesz używać obu klawiszy jednocześnie. Po prostu wpisz
sklonować swoje repozytorium.
Musisz wykonać powyższe polecenie po ponownym uruchomieniu komputera.
źródło
Używam gita w wersji 2.16 i nie potrzebuję ani jednego skryptu, nawet konfiguracji lub zmodyfikowanych poleceń.
I git automatycznie czyta klucz. Nic nie pytam i nie rzuca błędu. Po prostu działa dobrze.
źródło
~/.ssh
katalogu”?Chociaż pytanie nie wymaga tego, zamieszczam tę odpowiedź dla każdego, kto chce rozwiązać ten sam problem tylko dla gitlab .
Rozwiązanie gitlab
Próbowałem użyć podejścia do zmiennych środowiskowych , ale nawet dokumentacja git zaleca używanie
~/.ssh/config
czegoś więcej niż prostego przypadku. W moim przypadku pcham na serwer gitlab - i chciałem to zrobić jako określony użytkownik - który jest oczywiście definiowany przez klucz prywatny podczas uwierzytelniania, a nie nazwę użytkownikagit
. Po wdrożeniu po prostu wykonuję następujące czynności:Ustawiać
Przypomnij sobie lokalizację twojego klucza prywatnego
/myfolder/.ssh/my_gitlab_id_rsa
w moim przypadku.Dodaj wpis w
~/.ssh/config
:Dodaj alias git w
~/.gitconfig
:Jako bonus wykonuję swoje zatwierdzenia na tym samym hoście jako określony użytkownik za pomocą tego aliasu git :
Wyjaśnienie
Wszystkie powyższe zakłada, że odpowiedni pilot jest,
origin
a odpowiedni oddział jest obecnie sprawdzony. W celach informacyjnych natknąłem się na kilka elementów, które należało rozwiązać:gitlab_as_me
i nie podobało mi się widzenie dodatkowego pilota wiszącego w moim drzewie dziennika, więc usuwam go po zakończeniugitlab_as_me
, musisz dokładnie określić, którą gałąź naciskaszorigin
wskaźnik lokalny musi zostać „zaktualizowany” w celu dopasowaniagitlab_as_me
(git pull origin $branch
robi to)źródło
Wprowadź ścieżkę, którą chcesz zapisać (np. My-pc / Desktop / .ssh / ed25519)
Dodaj klucz publiczny do gitlab ( Jak dodać klucz ssh do gitlab )
źródło
źródło