Określ klucz SSH dla git push dla danej domeny

Mam następujący przypadek użycia: chciałbym móc wcisnąć do {[0] } używając klucza prywatnego użytkownika gitolite-admin, podczas gdy chcę wcisnąć do [email protected]:some_repo używając 'własnego' klucza prywatnego. AFAIK, nie mogę tego rozwiązać używając ~/.ssh/config, ponieważ nazwa użytkownika i nazwa serwera są identyczne w obu przypadkach. Ponieważ najczęściej używam własnego klucza prywatnego, zdefiniowałem go w ~/.ssh/config dla [email protected]. Czy ktoś zna sposób na nadpisanie klucza używanego do pojedynczego wywołania git?

(na bok: gitolite odróżnia kto jest wykonywanie pchania w oparciu o klucz, więc nie jest problemem, jeśli chodzi o dostęp, własność i audyt, że ciąg user @ server jest identyczny dla różnych użytkowników.)

8 answers

Nawet jeśli użytkownik I host są tymi samymi, nadal można je rozróżnić w ~/.ssh/config. Na przykład, jeśli Twoja konfiguracja wygląda tak:

Host gitolite-as-alice
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_rsa.alice
  IdentitiesOnly yes

Host gitolite-as-bob
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_dsa.bob
  IdentitiesOnly yes

Następnie wystarczy użyć gitolite-as-alice i gitolite-as-bob zamiast nazwy hosta w adresie URL:

git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git

Uwaga

Chcesz dołączyć opcję IdentitiesOnly yes, aby zapobiec używaniu domyślnych identyfikatorów. 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 konfiguracyjnych (które są zgodne z "first in wins") opcja IdentityFile dołącza do listy tożsamości do wypróbowania. Zobacz: https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807

 511
Author: Mark Longair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:13:35

Alternatywnym podejściem do zaproponowanym powyżej przez Marka Longairajest użycie aliasu, który uruchomi dowolnepolecenie git, na dowolnym zdalnym, z alternatywnym kluczem ssh. Chodzi o zmianę tożsamości SSH podczas uruchamiania komend git.

Zalety w stosunku do podejścia do aliasów hosta w drugiej odpowiedzi:

  • będzie działać z dowolnymi poleceniami lub aliasami git, nawet jeśli nie możesz podać remote wyraźnie.
  • łatwiejsze w pracy z wieloma repozytoriami, ponieważ trzeba je skonfigurować tylko raz na maszynę kliencką, a nie raz na repozytorium na każdej maszynie klienckiej.

Używam kilku małych skryptów i aliasu git admin. W ten sposób mogę zrobić, na przykład:

git admin push 

Aby przejść do domyślnego pilota używając alternatywnego ("admin") klucza SSH. Ponownie możesz użyć dowolnego polecenia (nie tylko push) z tym aliasem. Możesz nawet zrobić git admin clone ..., aby sklonować repozytorium, które masz tylko dostęp do klucza "admin".

Krok 1: Utwórz alternatywne klucze SSH, opcjonalnie Ustaw hasło, jeśli robisz to na cudzej maszynie.

Krok 2: Utwórz skrypt o nazwie "ssh-as.sh" uruchamia rzeczy, które używają SSH, ale używają podanego klucza SSH, a nie domyślnego:

#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"

Krok 3: Utwórz skrypt o nazwie "git-as.sh", który uruchamia polecenia git używając podanego klucza SSH.

#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"

Krok 4: Dodaj alias (używając czegoś odpowiedniego dla" PATH_TO_SCRIPTS_DIR " poniżej):

# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"

Więcej szczegółów na stronie: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/

 53
Author: sinelaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:24

Możesz użyć zmiennej środowiskowej git GIT_SSH_COMMAND. Uruchom to w terminalu pod repozytorium git:

GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init

Zastąp ~/.ssh/your_private_key ścieżką klucza prywatnego ssh, której chcesz użyć. I możesz zmienić kolejne polecenie git (w przykładzie jest git submodule update --init) na inne takie jak git pull, git fetch, itd.

 19
Author: Hustlion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 03:31:40

Inną alternatywą jest użycie ssh-ident, do zarządzania tożsamościami ssh .

Automatycznie ładuje i używa różnych kluczy na podstawie bieżącego katalogu roboczego, opcji ssh i tak dalej... co oznacza, że możesz łatwo mieć katalog work / I katalog private/, który przejrzyście kończy się przy użyciu różnych kluczy i tożsamości z ssh.

 10
Author: rabexc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-02 02:06:11

Jeden z systemów opartych na Uniksie (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żywasz ssh bez opcji -i, używa ona domyślnego klucza prywatnego do uwierzytelniania za pomocą zdalnego systemu.

Jeśli masz inny klucz prywatny, którego chcesz użyć, na przykład $Strona główna/.SSH / deploy_key, musisz użyć ssh -i ~/.ssh/deploy_key ...

To irytujące. Możesz dodać następujące linie do swojego $Strona główna/.bash_profile : ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

Więc za każdym razem, gdy używasz ssh lub git lub scp (w zasadzie ssh też), nie musisz już używać opcji -i.

Możesz dodać dowolną liczbę kluczy do pliku $Strona główna/.bash_profile.

 10
Author: Châu Hồng Lĩnh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-05 03:16:18

Używam Git Basha na Win7. To mi się udało.

Utwórz plik konfiguracyjny w~/.ssh / config lub c:/users/[your_user_name]/.ssh / config. W pliku wpisz:

Host your_host.com
     IdentityFile [absolute_path_to_your_.ssh]\id_rsa

Myślę, że host musi być adresem URL, a nie tylko "nazwa" lub ref dla Twojego hosta. Na przykład,

Host github.com
     IdentityFile c:/users/[user_name]/.ssh/id_rsa

Ścieżka może być również zapisana w /C / users/[user_name]/.... format

Rozwiązanie dostarczone przez Giordano Scalzo jest również świetne. https://stackoverflow.com/a/9149518/1738546

 8
Author: user1738546,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:38

Jeśli używasz SSH w wersji Gita na windows, linia pliku tożsamości w konfiguracji ssh wygląda tak:

IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice

Gdzie /c jest dla c:

Aby sprawdzić, w GIT ' s bash do

cd ~/.ssh
pwd 
 3
Author: Andrew Murphy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-20 10:14:22

Może być konieczne usunięcie (lub skomentowanie) domyślnej konfiguracji hosta .SSH / config

 2
Author: ViliusK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-28 08:37:59