Mam następujący przypadek użycia: Chciałbym móc naciskać na [email protected]:gitolite-admin
używanie klucza prywatnego użytkownika gitolite-admin
, natomiast chcę naciskać na [email protected]:some_repo
używanie „własnego” klucza prywatnego. AFAIK, nie mogę rozwiązać tego za pomocą ~/.ssh/config
, ponieważ nazwa użytkownika i nazwa serwera są identyczne w obu przypadkach. Ponieważ w większości używam własnego klucza prywatnego, zdefiniowałem go ~/.ssh/config
dla [email protected]
. Czy ktoś zna sposób na zastąpienie klucza używanego do pojedynczego git
wywołania?
(Poza tym: gitolite rozróżnia, kto wykonuje wypychanie na podstawie klucza, więc pod względem dostępu, własności i audytu nie ma problemu, że ciąg user @ server jest identyczny dla różnych użytkowników.)
Odpowiedzi:
Nawet jeśli użytkownik i host są tacy sami, nadal można je rozróżnić
~/.ssh/config
. Na przykład, jeśli twoja konfiguracja wygląda następująco:Następnie po prostu użyj
gitolite-as-alice
igitolite-as-bob
zamiast nazwy hosta w swoim adresie URL:Uwaga
Chcesz dołączyć opcję
IdentitiesOnly yes
zapobiegania domyślnym identyfikatorom. W przeciwnym razie, jeśli masz również pliki id pasujące do domyślnych nazw, zostaną one wypróbowane jako pierwsze, ponieważ w przeciwieństwie do innych opcji konfiguracji (które są zgodne z „pierwszymi wygranymi”),IdentityFile
opcja dołącza się do listy tożsamości do wypróbowania. Zobacz: /server/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807źródło
git@
Część w pilocie nie jest konieczne, ponieważ jest ona podana wUser
wierszu config.IdentitiesOnly yes
bezpośrednio po liniiIdentityFile
dla hosta. Wygląda na to, że przekazywał wiele tożsamości, a jedna z nich nie miała dostępu do hosta.Alternatywnym podejściem do powyższego oferowanego przez Marka Longaira jest użycie aliasu, który uruchomi dowolne polecenie git na dowolnym pilocie z alternatywnym kluczem SSH. Chodzi przede wszystkim o zmianę tożsamości SSH podczas uruchamiania poleceń git.
Zalety w stosunku do aliasu hosta w innej odpowiedzi:
remote
wprost.Używam kilku małych skryptów i aliasu git
admin
. W ten sposób mogę na przykład:Aby przekazać do domyślnego pilota przy użyciu alternatywnego („admin”) klucza SSH. Ponownie możesz użyć dowolnego polecenia (nie tylko
push
) z tym aliasem. Możesz nawetgit admin clone ...
sklonować repozytorium, do którego miałbyś dostęp tylko przy użyciu klucza „admin”.Krok 1: Utwórz alternatywne klucze SSH, opcjonalnie ustaw hasło w przypadku, gdy robisz to na czyimś komputerze.
Krok 2: Utwórz skrypt o nazwie „ssh-as.sh”, który uruchamia rzeczy korzystające z SSH, ale używa danego klucza SSH zamiast domyślnego:
Krok 3: Utwórz skrypt o nazwie „git-as.sh”, który uruchamia polecenia git przy użyciu podanego klucza SSH.
Krok 4: Dodaj alias (używając czegoś odpowiedniego dla „PATH_TO_SCRIPTS_DIR” poniżej):
Więcej informacji: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/
źródło
$@
->"$@"
dla bezpieczeństwa.Możesz użyć zmiennej środowiskowej git
GIT_SSH_COMMAND
. Uruchom to w swoim terminalu pod repozytorium git:Zastąp
~/.ssh/your_private_key
ścieżkę prywatnego klucza ssh, którego chcesz użyć. I można zmienić późniejsze polecenia git (w przykładzie jestgit submodule update --init
), aby inni lubiągit pull
,git fetch
itpźródło
Jeden system uniksowy (Linux, BSD, Mac OS X), domyślna tożsamość jest przechowywana w katalogu $ HOME / .ssh , w 2 plikach:
private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub
Gdy używaszssh
bez opcji-i
, używa domyślnego klucza prywatnego do uwierzytelnienia w systemie zdalnym.Jeśli masz inny klucz prywatny, którego chcesz użyć, na przykład $ HOME / .ssh / deploy_key , musisz użyć
ssh -i ~/.ssh/deploy_key ...
To jest denerwujące. Możesz dodać następujące wiersze do swojego $ HOME / .bash_profile :
ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa
Więc za każdym razem używasz
ssh
lubgit
lubscp
(w zasadziessh
też), nie trzeba korzystać z opcji-i
więcej.Możesz dodać dowolną liczbę kluczy w pliku $ HOME / .bash_profile .
źródło
Inną alternatywą jest użycie ssh-ident do zarządzania tożsamością ssh .
Automatycznie ładuje i używa różnych kluczy w oparciu o bieżący katalog roboczy, opcje ssh itd., Co oznacza, że możesz łatwo mieć katalog roboczy / katalog prywatny / katalog, który w przejrzysty sposób używa różnych kluczy i tożsamości z ssh.
źródło
Używam Git Bash na Win7. Poniższe działało dla mnie.
Utwórz plik konfiguracyjny w ~ / .ssh / config lub c: / users / [twoja_nazwa_użytkownika] / .ssh / config. W pliku wpisz:
Wydaje mi się, że host musi być adresem URL, a nie tylko „nazwą” lub referencją dla twojego hosta. Na przykład,
Ścieżkę można również zapisać w formacie / c / users / [nazwa_użytkownika] / ....
Świetne jest również rozwiązanie dostarczone przez Giordano Scalzo. https://stackoverflow.com/a/9149518/1738546
źródło
Od gita 2.10 w górę można również użyć ustawienia sshCommand gitconfig. Stan dokumentów :
Przykładem użycia może być:
git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]
W niektórych przypadkach nie działa to, ponieważ ssh_config przesłania polecenie, w tym przypadku spróbuj
ssh -i ~/.ssh/[insert_your_keyname] -F /dev/null
nie używać ssh_config.źródło
Skopałem razem i przetestowałem z github następujące podejście, oparte na czytaniu innych odpowiedzi, które łączy kilka technik:
Zaletą tego podejścia jest to, że po skonfigurowaniu nie wymaga żadnej dodatkowej pracy, aby uzyskać prawidłowe działanie - na przykład nie trzeba zmieniać zdalnych adresów URL ani pamiętać o klonowaniu różnych elementów - przepisywanie adresów URL sprawia, że wszystko działa .
~/.ssh/config
~/.gitconfig
~/dev/work/.gitconfig
Tak długo, jak trzymasz wszystkie repozytoria pracy w ~ / dev / work i rzeczy osobiste gdzie indziej, git będzie używał poprawnego klucza SSH podczas wykonywania pull / clones / pushów na serwerze, a także dołącza poprawny adres e-mail do wszystkich twoje zobowiązania.
Bibliografia:
1
2)
źródło
includeIf
powinien działać tylko wtedy, gdy istnieje.git
katalog, o którym myślałem?Jeśli używasz wersji ssh Gita w systemie Windows, wygląda linia pliku tożsamości w konfiguracji ssh
gdzie
/c
jestc:
Aby to sprawdzić, w git's bash wykonaj
źródło
Może być konieczne usunięcie (lub skomentowanie) domyślnej konfiguracji hosta
źródło
najbardziej określony w kluczu konfiguracji pliku ssh:
źródło
Jak ktoś wspomniał,
core.sshCommand
config może zostać użyty do zastąpienia klucza SSH i innych parametrów.Oto przykład, w którym masz alternatywny klucz o nazwie
~/.ssh/workrsa
i chcesz go użyć dla wszystkich sklonowanych repozytoriów~/work
..gitconfig
plik w~/work
:~/.gitconfig
dodaj:źródło
Jedną z możliwości wykorzystania
~/.ssh/config
jest użycieMatch
ograniczenia zamiastHost
ograniczenia. W szczególnościMatch Exec
wywołuje polecenie powłoki, aby zdecydować, czy zastosować deklaracje, czy nie. W bashu możesz użyć następującego polecenia:Używa
[
polecenia bash do sprawdzenia, czy dwa ciągi są równe. W tym przypadku sprawdza się, czy ciąg znaków[email protected]:gitolite-admin
pasuje do wyniku uzyskanego z$(git config --get remote.origin.url)''
polecenia.Możesz użyć dowolnego innego polecenia identyfikującego repozytorium, w którym znajduje się powłoka. Aby to zadziałało, ważne jest, aby mieć
$SHELL
zmienną zdefiniowaną dla twojej powłoki, w moim przypadku/bin/bash
. Pełny przykład byłby następujący~/.ssh/config
:W tym przykładzie założyłem, że
~/.ssh/yourOwnPrivateKey
zawiera Twój prywatny klucz i że~/.ssh/gitolite-admin
zawiera prywatny klucz użytkownikagitolite-admin
. I obejmowałIdentitiesOnly yes
deklarację, aby upewnić się, że tylko jeden klucz jest przeznaczona do serwera git, wspomnianej przez Mark Longair . Pozostałe deklaracje są tylko standardowymi opcjami ssh dla git.Możesz dodać tę konfigurację, jeśli masz kilka
some_repo
, których chcesz używać z różnymi kluczami. Jeśli masz kilka repozytoriów[email protected]
i większość z nich korzysta z~/.ssh/yourOwnPrivateKey
tego, bardziej sensowne jest włączenie tego klucza jako domyślnego dla hosta. W takim przypadku~/.ssh/config
byłoby to:Pamiętaj, że kolejność ma znaczenie, a
Host git.company.com
ograniczenie powinno pojawić się poMatch Exec
jednym lub jednym.źródło
Skonfiguruj swoje repozytorium za pomocą
git config
. Na przykład:źródło