Mam 2 serwery Git, które wymagają 2 różnych kluczy SSH.
git clone user1@server1:blahblahblah
używa ~/.ssh/id_rsa
, ale muszę określić, którego klucza użyć w zależności od serwera, z którym się łączę.
Jaki parametr wiersza polecenia Git wykonuje to zadanie? (Używam Linuksa.)
Odpowiedzi:
Jeśli łączysz się przez SSH, klucz będzie kontrolowany przez parametr SSH, a nie parametr git.
SSH szuka w
~/.ssh/config
pliku parametrów konfiguracyjnych. Zmodyfikuj ten plik i dodaj wpisy IdentityFile dla dwóch serwerów Git w następujący sposób:Ten artykuł zawiera więcej szczegółów.
źródło
ssh-agent
i użyć,ssh-add
a następnie po prostu użyć git. Kiedy git łączy się przez ssh, klucz jest już włączony. Widzisz, jest kilka sposobów, a Twoja pierwotna odpowiedź po prostu nie pomaga.Jest inna możliwość. To do ustawienia
core.sshCommand
npJest jeden konkretny scenariusz, w którym ta strategia jest szczególnie przydatna: kiedy masz wiele kont na Github, tak jak wszystkie konta
ssh
na Github jako,[email protected]
i używassh
klucza do określenia, którym jesteś użytkownikiem Github. W takim przypadku ani.ssh/config
niessh-agent
zrobisz tego, co chcesz.Aktualizacja - nie możesz uruchomić powyższego, dopóki nie masz lokalnego repozytorium, więc jeśli próbujesz sklonować repozytorium zdalne, musisz ręcznie określić klucz zgodnie z odpowiedzią drewbie18:
Po sklonowaniu repozytorium możesz użyć
git config
polecenia, aby ustawić to na stałe.źródło
git init
repozytorium, skonfigurować je lokalnie, aby używał poprawnego polecenia ssh, a następnie dodać zdalne (3 kroki, w porównaniu do tylko 1 z "git clone").Ogólnie chcesz do tego użyć
~/.ssh/config
. Po prostu sparuj adresy serwerów z kluczami, których chcesz ich użyć w następujący sposób:Host *
oznacza dowolny serwer, więc używam go, aby ustawić~/.ssh/id_rsa
jako domyślny klucz do użycia.źródło
W moim scenariuszu, podobnym do scenariusza @Richard Smith (którego rozwiązanie, BTW, nie zadziałało dla mnie), muszę użyć różnych kluczy dla tego samego serwera w różnych repozytoriach.
Obejściem dla mnie było poprawne skonfigurowanie sesji ze zmienną środowiskową
GIT_SSH_COMMAND
, na przykład:Aktualizacja :
Inną rzeczą, na którą należy zwrócić uwagę, jest to, że prawidłowe ustawienie zmiennej środowiskowej może być kłopotliwe, więc używam narzędzi modyfikacji wiersza polecenia udostępnianych przez takie rzeczy, jak Liquid Prompt lub Fish Shell, aby podłączyć się do powłoki i kontynuować aktualizację zmiennych środowiskowych zgodnie aktualny katalog i niektóre zasady. Na przykład wszystkie moje projekty osobiste, które wymagają mojego osobistego klucza SSH z Gitlab, znajdują się pod nim,
~/Documents/Projects/personal
więc kiedy hak powłoki działapwd
i stwierdza, że bieżący katalog znajduje się pod tą ścieżką, automatycznie ustawiaGIT_SSH_COMMAND
zmienne w razie potrzeby.źródło
Użyj
ssh-add path-to-private-key
go działa po wyjęciu z pudełka.źródło
Możesz ustawić konfigurację --global lub --local, global zaktualizuje
~/.gitconfig
plik, local zaktualizuje konfigurację w repozytorium.git/config
i nadpisze konfigurację globalną (~ / .gitconfig)źródło
Użytkownik systemu Windows tutaj, właśnie natknąłem się na ten problem i mam nieco inne rozwiązanie niż dotychczas przeczytałem. Problem, z którym się spotkałem, polega na tym, że po prostu chciałem sklonować repozytorium przy użyciu określonego prywatnego klucza ssh i nie muszę globalnie konfigurować mojej konfiguracji git ani dodawać określonych ustawień git bash, ponieważ wykonuję swoją pracę w PowerShell. Zasadniczo chcę tylko, aby klucze prywatne znajdowały się w moim folderze .ssh i odnoszę się do nich w określonych repozytoriach zgodnie z wymaganiami.
W tym celu działa następujące polecenie:
Zasadniczo po zainicjowaniu repozytorium git ustawia opcję core.sshCommand przed uruchomieniem klonu. Więc konkretny klucz ssh, którego chcesz użyć dla tego repozytorium, jest ustawiony TYLKO dla tego repozytorium. To może nie być idealne rozwiązanie dla wszystkich przypadków, ale chcę tego.
źródło
-c
możliwościgit clone
. Jest to lepsze niż ustawienie środowiska, jak sugeruję podczas klonowania.Inne odpowiedzi zainspirowały mnie do napisania małego skryptu, który wybiera klucz ssh w zależności od opcji wiersza poleceń lub (jeśli jest obecny) wartości git remote -v. Mam nadzieję, że to pomoże!
Aby właściwie odpowiedzieć na pytanie: użyj gat.
Zobacz także https://bitbucket.org/eikerobert/gat/src/master/
#!/bin/bash usegat=false for VAR in "$@" do if [ "$VAR" != "${VAR/[email protected]:myaccount/}" ]; then usegat=true fi done if [ $usegat=false ]; then /usr/bin/git rev-parse --is-inside-work-tree >/dev/null 2>&1 isinsidegitrepo=$? #echo $isinsidegitrepo if [ $isinsidegitrepo = 0 ]; then remote=`/usr/bin/git remote -v` if [ "$remote" != "${remote/[email protected]:myaccount/}" ]; then usegat=true fi fi fi if [ $usegat = true ]; then # echo "TRUE" /usr/bin/git -c core.sshCommand="/usr/bin/ssh -i /home/myaccount/.ssh/mykey" "$@" else #echo "FALSE" /usr/bin/git "$@" fi
źródło
Inną opcją jest napisanie małego skryptu do wykonania
core.sshCommand
go nieco mądrzejszym - sprawdź, czy bieżący katalog roboczy ma skonfigurowany określony klucz SSH, a jeśli tak, użyj go, w przeciwnym razie - polegaj na standardowej rozdzielczości klucza SSH.Oto moja pierwsza wersja:
#!/bin/bash key="$(git config ssh.key)" if [ -n "$key" ]; then ssh -o IdentitiesOnly=yes -i "$key" "$@" else ssh "$@" fi
Następnie skonfiguruj go jako globalne polecenie git SSH:
(
~/.local/bin
to aktualny standard „umieszczania tutaj skryptów użytkownika” w systemach operacyjnych SystemD )Po skonfigurowaniu możesz skonfigurować dowolne repozytorium, aby korzystało z określonego klucza SSH, ustawiając opcję konfiguracji
ssh.key
:Dodatkowe opcjonalne sztuczki
ssh.key
aby mieć „domyślny awaryjny klucz SSH inny niż domyślny” lub coś w tym stylu.core.sshCommand
w katalogu głównym repozytorium, twój niestandardowygit-ssh-command
może to sprawdzić i mieć pewne heurystyki dotyczące nazw katalogów. Można to zrobić welse
sekcji, więc heurystyka działa tylko wtedy, gdy nie ma określonego kluczassh.key
.git remote -v
czek, aby dodać heurystykę opartą na pilotach, jak w skrypcie Eikeremote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"
na początku skryptu, aby rozwiązać problem z pilotem, na którym jest obsługiwany - i porównać z tym ($remote
wyglądałby jak środkowa kolumna nagit remote -v
wyjściu).Aktualizacja:
Oto wersja niestandardowego polecenia SSH, które sprawdza zdalny adres URL i wykonuje pewne heurystyki - w moim przypadku mam kilka różnych tożsamości z tą samą publiczną usługą hostingu git (jedną do pracy, jedną do celów osobistych itp.) I mogę wybrać poprawną tożsamość, patrząc na zdalny adres URL (sprawdzając grupę Gitlab lub organizację Github itp.):
#!/bin/bash if [[ "$2" =~ ^git-lfs-authenticate.* ]]; then # reconstruct url for git-lfs remote="$1:$(awk '{print$2}'<<<"$2")" else # reconstruct url for standard git commands remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")" fi #echo "Detected $remote from $@" >&2 # optional debug log key="$(git config ssh.key)" if [ -n "$key" ]; then # use specified SSH key, if set ssh -o IdentitiesOnly=yes -i "$key" "$@" elif [[ "$remote" == [email protected]:my-company* ]]; then # use company id ssh -o IdentitiesOnly=yes -i ~/.ssh/company-id "$@" elif [[ "$remote" =~ [email protected]:.*other-org.* ]]; then # bitbucket has weird urls ssh -o IdentitiesOnly=yes -i ~/.ssh/custom-org-key "$@" else # otherwise use whatever the agent has (my personal key) ssh "$@" fi
źródło