Może to dość nietypowa sytuacja, ale chcę określić prywatny klucz SSH, który będzie używany podczas wykonywania polecenia powłoki (git) z komputera lokalnego.
Zasadniczo tak:
git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"
Lub nawet lepiej (w Ruby):
with_key("/home/christoffer/ssh_keys/theuser") do
sh("git clone [email protected]:TheUser/TheProject.git")
end
Widziałem przykłady łączenia się ze zdalnym serwerem za pomocą Net :: SSH, który używa określonego klucza prywatnego, ale jest to polecenie lokalne. Czy to możliwe?
-i
opcjissh
.git config core.sshCommand 'ssh -i private_key_file'
. Zobacz moją odpowiedź poniżejOdpowiedzi:
Coś takiego powinno działać (sugerowane przez orip):
jeśli wolisz podpowłoki, możesz wypróbować następujące (choć jest to bardziej delikatne):
Git wywoła SSH, który znajdzie swojego agenta według zmiennej środowiskowej; to z kolei spowoduje załadowanie klucza.
Alternatywnie, ustawienie
HOME
może również załatwić sprawę, pod warunkiem, że chcesz skonfigurować katalog, który zawiera tylko.ssh
katalog asHOME
; może to zawierać plik tożsamości.pub lub plik konfiguracyjny IdentityFile.źródło
ssh-agent bash -c 'ssh-add sshkey; git clone url'
ssh-agent $(..)
Składnia nie działa na mnie, a ja nie wiem, jak to jest przypuszczać, aby pracy: (ba) sh powinien wykonywać polecenia wewnątrz$(..)
pierwszej, a następnie uruchomić ssh-agent z wyjściem jako parametr.Żadne z tych rozwiązań nie działało dla mnie.
Zamiast tego omawiam wzmiankę o @Martin v. Löwis o ustawianiu
config
pliku dla SSH.SSH wyszuka
~/.ssh/config
plik użytkownika . Mam swoją konfigurację jako:I dodaję zdalne repozytorium git:
A potem polecenia git działają dla mnie normalnie.
UWAGI
IdentitiesOnly yes
to konieczne, aby zapobiec domyślnemu zachowaniu SSH wysyłania pliku tożsamości zgodnego z domyślną nazwą pliku dla każdego protokołu. Jeśli masz plik o nazwie,~/.ssh/id_rsa
który zostanie wypróbowany PRZED twoją~/.ssh/id_rsa.github
bez tej opcji.Bibliografia
źródło
Host remote.server.com
i nadal używać oryginalnego adresu URLchmod 600 ~/.ssh/config
(patrz tutaj ). A jeśli używasz GitHub, wymienićHost gitserv
zHost github.com
pominąćHostname remote.server.com
i dodać pilot zgit remote add origin [email protected]:user_name/repo_name.git
.Począwszy od Gita 2.3.0 mamy również proste polecenie (nie wymaga pliku konfiguracyjnego):
źródło
cannot run ssh -i /home/vagrant/.ssh/git: No such file or directory
chociaż istnieje ona444 Nov 16 18:12 /home/vagrant/.ssh/git
odls -l /home/vagrant/.ssh/git
chmod 400 <path-to-private-key-file>
. W przeciwnym razie polecenie git może się nie powieść bez specjalnego komunikatu o błędzie ...-o IdentitiesOnly=yes
aby upewnić się, że klucz określony za pomocą-i
zostanie użyty (w przeciwieństwie do klucza od agenta SSH).Sugestie innych osób
~/.ssh/config
są bardzo skomplikowane. Może to być tak proste, jak:źródło
IdentitiesOnly
opcji.git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git
. Następnie konfiguracja wygląda następującoHost personal HostName github.com ... Host corporate HostName github.com
Zawartość my_git_ssh_wrapper:
Następnie możesz użyć klucza, wykonując:
źródło
GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
Z git 2.10+ (Q3 2016: zwolniony września 2d, 2016), masz możliwość, aby ustawić config dla
GIT_SSH_COMMAND
(i nie tylko zmienną środowiskową jak opisano w Rober Jack „s odpowiedzi )Zobacz commit 3c8ede3 (26 czerwca 2016 r.) Autor: Nguyễn Thái Ngọc Duy (
pclouds
) .(Połączone przez Junio C Hamano -
gitster
- w commit dc21164 , 19 lipca 2016)Oznacza to, że
git clone
mogą być:Możesz nawet ustawić tylko jedną komendę:
Jest to łatwiejsze niż ustawienie
GIT_SSH_COMMAND
zmiennej środowiskowej, która w systemie Windows, jak zauważył przez Mátyás Kuti-Kreszács byłobyźródło
git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git
a następnie zestaw konfiguracyjnygit config core.sshCommand 'ssh -i private_key_file'
Podsumowując odpowiedzi i komentarze , najlepszym sposobem na skonfigurowanie gita do używania różnych plików kluczy, a następnie zapomnienie o nim, który obsługuje również różnych użytkowników dla tego samego hosta (np. Osobiste konto GitHub i jeden roboczy), który działa w systemie Windows również polega na edycji
~/.ssh/config
(lubc:\Users\<your user>\.ssh\config
) i określaniu wielu tożsamości:Następnie, aby sklonować projekt jako osobisty użytkownik, po prostu uruchom zwykłe
git clone
polecenie.Aby sklonować repozytorium jako
workuser
, uruchomgit clone git@github-work:company/project.git
.źródło
dandv
iworkuser
wspieram mój przykład: „np. osobiste konto GitHub i konto robocze”.dandv
to moja nazwa użytkownika GitHub.IdentitiesOnly yes
do mojego pliku konfiguracyjnego ssh.Jak stwierdzono tutaj: https://superuser.com/a/912281/607049
Możesz skonfigurować go dla repo:
źródło
-F /dev/null
zrobić? O ile widzę to zmieni plik configFile z~/.ssh/config
domyślnego, ale dlaczego jest to pożądane? Aby zapewnić polecenie w trybie piaskownicy?Problem polega na tym, że masz różne zdalne repozytoria na tym samym hoście (powiedzmy github.com) i chcesz z nimi współdziałać przy użyciu różnych kluczy ssh (tj. Różnych kont GitHub).
Aby to zrobić:
Najpierw powinieneś zadeklarować różne klucze w
~/.ssh/config
pliku.W ten sposób kojarzysz drugi klucz z nową przyjazną nazwą „XXX” dla github.com.
Następnie musisz zmienić zdalne pochodzenie swojego repozytorium, aby używało zdefiniowanej właśnie przyjaznej nazwy.
Przejdź do lokalnego folderu repozytorium w wierszu polecenia i wyświetl bieżące zdalne pochodzenie:
Następnie zmień pochodzenie za pomocą:
Teraz możesz automatycznie naciskać, pobierać ... odpowiednim klawiszem.
źródło
lub
źródło
O wiele lepszym pomysłem jest dodanie tego hosta lub adresu IP do
.ssh/config
pliku w następujący sposób:źródło
git clone git@gh-work:repo/project.git
mojej ~ / .ssh / config mam dwie sekcje, które używają github.com dla nazwy hosta. Mają po prostu inny IdentityFile i Host~/.ssh/config
pastebin.com/8rYn7yCiPoszedłem ze zmienną środowiskową GIT_SSH. Oto moje opakowanie, podobne do tego z Joe Blocka z góry, ale obsługuje dowolną liczbę argumentów.
Plik ~ / gitwrap.sh
Następnie w moim .bashrc dodaj:
źródło
gitwrap.sh
, na przykład/home/ubuntu/gitwrap.sh
-o StrictHostKeyChecking=no
do polecenia sshJeśli żadne z innych rozwiązań tutaj nie działa, a utworzyłeś wiele kluczy ssh, ale nadal nie możesz robić prostych rzeczy, takich jak
zakładając, że masz dwa pliki kluczy ssh, takie jak
następnie w repozytorium git spróbuj:
a także upewnij się, że domyślna nazwa użytkownika i identyfikator użytkownika github są poprawne przez:
Aby uzyskać więcej informacji, zobacz https://gist.github.com/jexchan/2351996
źródło
Could not open a connection to your authentication agent.
, spróbuj$ eval `ssh-agent -s`
i spróbuj ponownie.ssh-add
sztuczka dowodzenia działała dla mnie. Dodaj klucz tożsamości do listy tych, które są wypróbowywane podczas uwierzytelniania ssh. To działało dla mnie dobrze!ssh-add
?.git
globalnie repo, a nie program git. Możesz użyć--global
do ustawienia globalnej nazwy użytkownika i adresu e-mail.Kiedy musisz połączyć się z github przy pomocy zwykłego żądania (
git pull origin master
), ustawienie Hosta jako*
w~/.ssh/config
mnie zadziałało, żaden inny Host (powiedzmy „github” lub „gb”) nie działał.źródło
Host my-host-alias
, musisz ustawićremote.origin.url=git@my-host-alias:[username]/[repo].git
.Wiele z tych rozwiązań wyglądało kusząco. Jednak najbardziej przydatne okazało się ogólne podejście do git-wrapping-script pod następującym linkiem:
Jak określić plik klucza ssh za pomocą
git
poleceniaChodzi o to, że nie ma
git
takich poleceń jak:Rozwiązaniem Alvina jest użycie dobrze zdefiniowanego skryptu bash-wrapper, który wypełnia tę lukę:
Gdzie
git.sh
jest:Mogę sprawdzić, czy to rozwiązało problem miałem z mającą użytkownika / klucza uznania dla zdalnej bitbucket z repo
git remote update
,git pull
orazgit clone
; wszystkie z nich działają teraz dobrze wcron
skrypcie zadania, który w innym przypadku miałby problemy z nawigacją po ograniczonej powłoce. Mogłem również wywołać ten skrypt z poziomu R i nadal rozwiązać dokładnie ten samcron
problem z uruchomieniem (npsystem("bash git.sh -i ~/.ssh/thatuserkey.pem pull")
.).Nie to, że R jest taki sam jak Ruby, ale jeśli R może to zrobić ... O :-)
źródło
GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone [email protected]:/git/repo.git
według odpowiedzi Roberta Jacka Will'a ?jeśli masz na swojej ścieżce katalog, w którym chcesz podpisać się danym plikiem identyfikacyjnym, możesz określić, aby użyć określonego pliku identyfikacyjnego za pomocą pliku .ssh / config, ustawiając
ControlPath
np .:Następnie
ssh
użyje określonego pliku tożsamości podczas wykonywania poleceń git w ramach podanej ścieżki roboczej.źródło
ControlMaster auto
iControlPersist yes
, aby nie trzeba było wpisywać hasła za każdym razem. Znaleziono informacje w tym artykuleMusisz utworzyć ~ / .ssh / config jak poniżej
pozwolenie jak poniżej
Dodaj swój klucz publiczny do swojego gita (cat ~ / .ssh / id_rsa_pub [lub nazwa simillar])
a następnie klon git jak poniżej
źródło
Wiele dobrych odpowiedzi, ale niektóre z nich zakładają wcześniejszą wiedzę administracyjną.
Myślę, że ważne jest, aby wyraźnie podkreślić, że jeśli rozpoczął swój projekt poprzez klonowanie URL internetowej -
https://github.com/<user-name>/<project-name>.git
to trzeba się upewnić, że
url
wartość mocy[remote "origin"]
w.git/config
zmieniono na SSH URL (patrz blok kodu poniżej).Oprócz tego upewnij się, że dodajesz
sshCommmand
następujące elementy:Przeczytaj więcej na ten temat tutaj .
źródło
W systemie Windows z Git Bash możesz dodać następujące repozytorium,
ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"'
na przykład:ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin [email protected]:test/test.git'
Który klucz prywatny znajduje się na dysku D, test folderu komputera. Również jeśli chcesz sklonować repozytorium, możesz to zmienić zagit remote add origin
pomocągit clone
.Po wprowadzeniu tego do Git Bash, poprosi Cię o hasło!
Uważaj, że klucz prywatny openssh i klucz prywatny kit są różne!
Jeśli utworzyłeś klucze w puttygen, musisz przekonwertować swój klucz prywatny na openssh!
źródło
Możesz użyć zmiennej środowiskowej GIT_SSH. Ale będziesz musiał zawinąć ssh i opcje w skrypt powłoki.
Zobacz instrukcję git:
man git
w powłoce poleceń.źródło
Używam
zsh
i różne klucze są ładowane automatycznie do mojej powłoki Zshssh-agent
automatycznie w innych celach (np. Dostęp do zdalnych serwerów) na moim laptopie. Zmodyfikowałem odpowiedź @ Nicka i używam jej do jednego z moich repozytoriów, które należy często odświeżać. (W tym przypadku to moja,dotfiles
której chcę ta sama i najnowsza wersja na wszystkich moich komputerach, gdziekolwiek pracuję).cd
katalog repo się powiódł, ściągnij ze zdalnego repoźródło
dla gitlaba
RSAAuthentication yes
doc jest tutaj
źródło
Aby zmienna środowiskowa GIT_SSH_COMMAND działała w systemie Windows zamiast:
Posługiwać się:
Cytat musi być jak
Niektóre backgorund: https://stackoverflow.com/a/34402887/10671021
źródło
Jeśli numer portu SSH nie jest 22 (domyślnie), dodać
Port xx
w~/.ssh/config
W moim przypadku (synologia)
Następnie sklonuj za pomocą tytułu hosta w konfiguracji. („moja_synologia”., aby uniknąć @chopstik '* ”)
źródło
Jeśli jesteś podobny do mnie, możesz:
Trzymaj klucze ssh w porządku
Utrzymuj proste polecenia klonowania git
Obsługa dowolnej liczby kluczy dla dowolnej liczby repozytoriów.
Ogranicz obsługę klucza SSH.
Trzymam klucze w
~/.ssh/keys
katalogu.Wolę konwencję niż konfigurację.
Myślę, że kodeks jest prawem; im jest to prostsze, tym lepiej.
KROK 1 - Utwórz alias
Dodaj ten alias do swojej powłoki:
alias git-clone='GIT_SSH=ssh_wrapper git clone'
KROK 2 - Utwórz skrypt
Dodaj ten skrypt ssh_wrapper do ŚCIEŻKI:
PRZYKŁADY
Użyj klucza github.com/l3x:
W poniższym przykładzie użyto również klucza github.com/l3x (domyślnie):
Użyj klucza bitbucket.org/lsheehan:
UWAGI
Zmień domyślny klucz SSH_KEY w skrypcie ssh_wrapper na używany przez większość czasu. W ten sposób nie musisz przez większość czasu używać zmiennej KEY.
Możesz pomyśleć: „Hej! To się często dzieje z aliasem, skryptem i katalogiem kluczy”, ale dla mnie to konwencja. Prawie wszystkie moje stacje robocze (i serwery w tym zakresie) są skonfigurowane podobnie.
Moim celem jest uproszczenie poleceń, które wykonuję regularnie.
Moje konwencje, np. Skrypty Bash, aliasy itp., Tworzą spójne środowisko i pomagają mi uprościć sprawę.
KISS i imiona mają znaczenie.
Więcej wskazówek dotyczących projektowania znajduje się w rozdziale 4 SOLID Design in Go z mojej książki: https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW
Mam nadzieję, że to pomaga. - Lex
źródło
Możesz wypróbować pakiet sshmulti npm do obsługi wielu kluczy ssh.
źródło
Problem z tą metodą polega na tym, że przynajmniej przy uruchomieniu przez bash.exe w systemie Windows, za każdym razem utworzy nowy proces, który pozostanie uśpiony.
Jeśli chcesz użyć tego do repozytorium synchronizacji zgodnie z harmonogramem, musisz dodać „&& ssh-agent -k” na końcu.
Coś jak:
ssh-agent -k zabije proces, gdy zostanie on zakończony.
źródło
Musiałem tylko dodać klucz, a następnie ponownie uruchomić klon git.
źródło
Oto włamanie do klucza ssh, które znalazłem, znajdując rozwiązanie tego problemu:
Na przykład masz 2 różne zestawy kluczy:
key1, key1.pub, key2, key2.pub
Trzymaj te klucze w swoim
.ssh
kataloguTeraz w swoim
.bashrc
lub.bash_profile
alias pliku dodaj następujące poleceniaalias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'
alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'
Voila! Masz skrót do przełączania klawiszy w dowolnym momencie!
Mam nadzieję, że to Ci odpowiada.
źródło