2011-07-14 11 views
31

Mam 2 serwery Git, które wymagają 2 różnych kluczy SSH.GIT wybierz klucz prywatny do użycia

git clone [email protected]:blahblahblah używa ~/.ssh/id_rsa, ale muszę określić, którego klawisza użyć w zależności od serwera, z którym się łączę.

Jaki parametr wiersza polecenia Git wykonuje to zadanie? (Używam Linuksa)

+1

To pytanie znajduje się na stronie http://superuser.com/questions/232373/tell-git-which-private-key-to-use. –

+0

możliwy duplikat [Podaj klucz SSH dla git push bez użycia ~/.ssh/config] (http: // stackoverflow.com/questions/7927750/specify-an-ssh-key-for-git-push-bez-używania-ssh-config) –

+0

Możliwy duplikat [Podaj prywatny klucz SSH do użycia podczas wykonywania polecenia powłoki z lub bez Ruby?] (http://stackoverflow.com/questions/4565700/specify-private-ssh-key-to-use-when-executing-shell-command-with-or-without-ruby) – Zaz

Odpowiedz

16

Jeśli łączysz się przez SSH, klucz będzie sterowany parametrem SSH, a nie parametrem git.

SSH wyszukuje w pliku ~/.ssh/config parametry konfiguracyjne. Zmodyfikować ten plik i dodawać wpisy IdentityFile dla dwóch Git serwerów takich jak ten:

Host server1.whatever.com 
    IdentityFile /path/to/key_1 
Host server2.whatever.com 
    IdentityFile /path/to/key_2 

This article ma trochę więcej szczegółów.

+3

To nie odpowiadało na pytanie. Pytanie brzmi: jak przekazać git ten parametr, gdy ssh obsługuje autoryzację? – keks

+0

@Keks: Nie * możesz * przekazywać argumentów ssh za pomocą wiersza poleceń git. Ta odpowiedź daje obejście. Możliwe są również inne sposoby obejścia problemu, na przykład https://git.wiki.kernel.org/index.php/GitTips#How_to_pass_ssh_options_in_git.3F. Zauważ, że to podejście nie używa również argumentów wiersza poleceń do modyfikowania zachowania ssh. –

+11

To prawda, jednak oryginalna odpowiedź nie odpowiedziała na pytanie. Możesz również użyć 'ssh-agent' i użyć' ssh-add', a następnie po prostu użyć git. Gdy git łączy się przez ssh, klucz jest już włączony. Widzisz, istnieje kilka sposobów, a twoja pierwotna odpowiedź po prostu nie pomaga. – keks

14

Użyj ssh-add path-to-private-key to działa po wyjęciu z pudełka.

19

Zasadniczo do tego celu należy użyć ~/.ssh/config. Wystarczy powiązać adresy serwerów z kluczami, które chcesz użyć do nich w następujący sposób:

Host github.com 
    IdentityFile ~/.ssh/id_rsa.github 
Host heroku.com 
    IdentityFile ~/.ssh/id_rsa.heroku 
Host * 
    IdentityFile ~/.ssh/id_rsa 

Host * oznacza dowolny serwer, więc używam go ustawić ~/.ssh/id_rsa jako klucz domyślny, aby wykorzystać.

+3

Ten pomysł nie działa, jeśli masz wiele kont na jednym serwerze, takim jak GitHub, i chcesz mieć inny klucz prywatny dla każdego z nich. – Flimm

+0

Dla wielu kont na jednym serwerze zobacz tę odpowiedź http://stackoverflow.com/questions/3225862/multiple-github-accounts-ssh-config – lexicalscope

10

Istnieje inna możliwość. To jest ustawienie core.sshCommand, np.

git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" 

Jest jeden szczególny scenariusz, gdy strategia ta jest szczególnie przydatna: to kiedy masz kilka kont na Github, ponieważ wszystkie rachunki ssh do Github jako [email protected] i wykorzystuje klucz ssh celu określenia, które Github użytkownik jesteś. W takim przypadku ani .ssh/config ani nie zrobi tego, co chcesz.

+0

To powinna być wybrana odpowiedź. Wymagana konfiguracja jest dobrze zlokalizowana w repozytorium, który musi używać innego klucza ssh, aby uzyskać dostęp do różnych serwerów git. Nie trzeba modyfikować ~/.ssh/config (i nawet/etc/hosts, w przypadku wielu kont na GitHub). –

+0

Jest jednak jeden problem: nie możesz sklonować repozytorium przed jego skonfigurowaniem, a aby go skonfigurować, musisz najpierw je sklonować. LUB, możesz "git init" zrobić repozytorium, skonfigurować je lokalnie, aby użyć poprawnej komendy ssh, a następnie dodać pilota (3 kroki, w porównaniu do 1 tylko z "git clone"). –

+1

Aby sklonować repo, skorzystam z poniższego rozwiązania @ Gussa, ustawiając zmienną środowiskową GIT_SSH_COMMAND. Ale w normalnym użyciu wolę moje rozwiązanie, ponieważ unika ponownego eksportowania tej zmiennej za każdym razem, gdy rozpoczynam nową powłokę. –

10

W moim scenariuszu, podobnym do scenariusza @Richarda Smitha (którego rozwiązanie, BTW, nie działa dla mnie), potrzebuję użyć różnych kluczy dla tego samego serwera pod różnymi repozytoriami.

Rozwiązaniem dla mnie było, aby skonfigurować sesję poprawnie zmiennej środowiskowej GIT_SSH_COMMAND, tak:

export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy" 

Aktualizacja:

Inną rzeczą, aby pamiętać, jest to, że ustawienie zmiennej środowiskowej poprawnie może być zgiełkiem, więc używam opcji modyfikacji wiersza poleceń dostarczanych przez takie rzeczy, jak Liquid Prompt of Fish Shell, aby podłączyć się do powłoki i aktualizować zmienne środowiskowe zgodnie z bieżącym katalogiem i niektórymi regułami. Na przykład wszystkie moje osobiste projekty, które wymagają mojego osobistego klucza SSH z Gitlabem, są pod ~/Documents/Projects/personal, więc gdy hak powłoki działa pwd i stwierdzi, że katalog bieżący znajduje się pod tą ścieżką, automatycznie ustawia zmienne GIT_SSH_COMMAND w razie potrzeby.

Powiązane problemy