Podać prywatny klucz SSH do użycia podczas wykonywania polecenia powłoki?
Może to dość nietypowa sytuacja, ale chcę podać prywatny klucz SSH do użycia podczas wykonywania polecenia powłoki (git) z lokalnego komputera.
W zasadzie tak:
git clone [email protected]: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 komenda lokalna. Czy to możliwe?
18 answers
Coś takiego powinno działać (zasugerowane przez orip):
ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'
Jeśli wolisz subshells, możesz spróbować następujących (choć jest bardziej delikatny):
ssh-agent $(ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git)
Git wywoła SSH, który znajdzie swojego agenta po 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 katalog .ssh
jako HOME
; może to zawierać tożsamość.pub, czyli plik konfiguracyjny ustawianie IdentityFile.
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-11-22 20:42:26
Żadne z tych rozwiązań nie zadziałało.
Zamiast tego rozwijam wzmiankę @Martin v. Löwis o ustawieniu pliku config
dla SSH.
SSH będzie szukał pliku ~/.ssh/config
użytkownika. Mam swoją konfigurację jako:
Host gitserv
Hostname remote.server.com
IdentityFile ~/.ssh/id_rsa.github
IdentitiesOnly yes # see NOTES below
I dodaję zdalne repozytorium git:
git remote add origin git@gitserv:myrepo.git
I wtedy komendy git działają normalnie dla mnie.
git push -v origin master
Uwagi
-
IdentitiesOnly yes
jest wymagane, aby zapobiec domyślnemu zachowaniu SSH wysyłania dopasowanego pliku tożsamości domyślna nazwa pliku dla każdego protokołu. Jeśli Masz plik o nazwie~/.ssh/id_rsa
, który zostanie wypróbowany przed~/.ssh/id_rsa.github
bez tej opcji.
Referencje
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
2018-02-02 13:43:09
Sugestie innych ludzi na temat ~/.ssh/config
są bardzo skomplikowane. To może być tak proste jak:
Host github.com
IdentityFile ~/.ssh/github_rsa
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-08-05 17:24:14
Począwszy od Git 2.3.0 mamy również proste polecenie (nie jest potrzebny plik konfiguracyjny):
GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git
Może być konieczne ponowne uruchomienie usługi ssh na komputerze.
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
2018-09-25 09:19:10
Zawartość my_git_ssh_wrapper:
#!/bin/bash
ssh -i /path/to/ssh/secret/key $1 $2
Następnie możesz użyć klucza wykonując:
GIT_SSH=my_git_ssh_wrapper git clone [email protected]:TheUser/TheProject.git
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
2012-02-17 01:32:57
Podsumowując odpowiedzi i komentarze , najlepszym sposobem, aby skonfigurować git tak, aby używał różnych plików kluczy, a następnie zapomnieć o tym, który obsługuje również różnych użytkowników dla tego samego hosta (np. osobiste konto GitHub i robocze), które działa również na Windows, jest edycja ~/.ssh/config
(lub c:\Users\<your user>\.ssh\config
) i określenie wielu tożsamości:
Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandv
Host github-work
HostName github.com
IdentityFile /path/to/your/work/github/private/key
User workuser
Następnie, aby sklonować projekt jako osobistego użytkownika, po prostu uruchom zwykłe polecenie git clone
.
Aby sklonować repo jako workuser
, Uruchom git clone git@github-work:company/project.git
.
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-11-13 08:59:26
Z git 2.10+ (Q3 2016: wydany Wrzesień 2016. 2d, 2016), masz możliwość ustawienia config dla GIT_SSH_COMMAND
(a nie tylko zmiennej środowiskowej opisanej w Rober Jack Will'S answer)
Zobacz commit 3c8ede3 (26 Jun 2016) by Nguyễn Thái Ngọc Duy (pclouds
).
(dodany przez Junio C Hamano -- gitster
-- in commit dc21164, 19 Jul 2016)
Nowa zmienna konfiguracyjna
core.sshCommand
został dodany do określ jaką wartość GIT_SSH_COMMAND ma użyć dla każdego repozytorium.
core.sshCommand:
Jeśli ta zmienna jest ustawiona,
git fetch
igit push
będą używać podanego polecenia zamiastssh
, gdy będą musiały połączyć się ze zdalnym systemem.
Polecenie ma taką samą postać jak zmienna środowiskowaGIT_SSH_COMMAND
i jest nadpisywane, gdy zmienna środowiskowa jest ustawiona.
Oznacza to, że git clone
może być:
cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file'
# later on
git clone host:repo.git
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:34
Jak podano tutaj: https://superuser.com/a/912281/607049
Możesz go skonfigurować per-repo:
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
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-03-20 10:18:19
O wiele lepszy pomysł, aby dodać ten host lub ip do pliku .ssh/config
w ten sposób:
Host (a space separated list of made up aliases you want to use for the host)
User git
Hostname (ip or hostname of git server)
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)
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
2013-01-31 12:23:10
Wybrałem zmienną środowiskową GIT_SSH. Oto mój wrapper, podobny do tego z Joe Blocka z góry, ale radzi sobie z dowolną ilością argumentów.
Plik ~/gitwrap.sh
#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"
Wtedy, w moim .bashrc, dodać:
export GIT_SSH=~/gitwrap.sh
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
2015-11-05 17:44:10
Kiedy musisz połączyć się z github za pomocą zwykłego żądania (git pull origin master
), ustawienie hosta jako *
w ~/.ssh/config
działało dla mnie, żaden inny Host (powiedzmy "github" lub "gb") nie działał.
Host *
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_xxx
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
2013-05-06 04:34:54
Wiele z tych rozwiązań wyglądało kusząco. Jednak okazało się, że ogólne podejście Git-wrapping-script pod poniższym linkiem jest najbardziej przydatne:
Jak określić plik klucza ssh za pomocą polecenia git
Chodzi o to, że nie ma git
polecenia takiego jak:
git -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git
Rozwiązanie Alvina polega na użyciu dobrze zdefiniowanego skryptu bash-wrappera, który wypełnia tę lukę:]}
git.sh -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git
Gdzie git.sh
jest:
#!/bin/bash
# The MIT License (MIT)
# Copyright (c) 2013 Alvin Abad
# https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command
if [ $# -eq 0 ]; then
echo "Git wrapper script that can specify an ssh-key file
Usage:
git.sh -i ssh-key-file git-command
"
exit 1
fi
# remove temporary file on exit
trap 'rm -f /tmp/.git_ssh.$$' 0
if [ "$1" = "-i" ]; then
SSH_KEY=$2; shift; shift
echo "ssh -i $SSH_KEY \$@" > /tmp/.git_ssh.$$
chmod +x /tmp/.git_ssh.$$
export GIT_SSH=/tmp/.git_ssh.$$
fi
# in case the git command is repeated
[ "$1" = "git" ] && shift
# Run the git command
git "$@"
Mogę zweryfikować, że to rozwiązałem problem, który miałem z rozpoznawaniem użytkownika / klucza dla zdalnego repo bitbucket z git remote update
, git pull
, i git clone
; wszystko to działa dobrze w skrypcie cron
, który w przeciwnym razie miał problemy z nawigacją po ograniczonej powłoce. Udało mi się również wywołać ten skrypt z poziomu R i nadal rozwiązać dokładnie ten sam problem cron
execute
(np. system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")
).
Nie to, że R jest tym samym co Ruby, ale jeśli R może to zrobić... O: -)
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
2015-02-21 00:05:24
Możesz użyć zmiennej środowiskowej GIT_SSH. Ale będziesz musiał owinąć ssh i opcje w skrypt powłoki.
Patrz instrukcja git: man git
w powłoce poleceń.
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-02-19 11:59:47
Sztuką dla mnie było użycie git@hostname zamiast http://hostname
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-03-12 14:43:25
W systemie Windows z Git Bash możesz użyć następujących sposobów, aby dodać 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. Jeśli chcesz sklonować repozytorium, możesz zmienić git remote add origin
za pomocą git clone
.
Po wpisaniu tego do Git Bash, poprosi Cię o hasło!
Pamiętaj, że klucz prywatny OpenSSH i klucz prywatny putty są różne!
Jeśli utworzyłeś swoje klucze za pomocą puttygen, musisz przekonwertować swój klucz prywatny na OpenSSH!
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-12-25 22:32:17
Używam zsh
i różne klucze są ładowane do mojej powłoki zsh ssh-agent
automatycznie w innych celach (tj. dostęp do zdalnych serwerów) na moim laptopie. Zmodyfikowałem odpowiedź @Nicka i używam jej do jednego z moich repów, które wymagają częstego odświeżania. (W tym przypadku jest to moja dotfiles
, której chcę tę samą i najnowszą wersję na wszystkich moich maszynach, gdziekolwiek pracuję.)
bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
- Spawn an ssh-agent
- Dodaj klucz tylko do odczytu do agenta
- zmień katalog na mój Git repo
- Jeśli
cd
to repo dir is successful, pull from remote repo - Kill Spolszczenie ssh-agent. (Nie chciałbym, żeby wielu agentów się tu kręciło.)
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-08-21 03:15:40
Dla gitlab RSAAuthentication yes
Host gitlab.com
RSAAuthentication yes
IdentityFile ~/.ssh/your_private_key_name
IdentitiesOnly yes
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-09-02 00:07:35
Jeśli numer portu SSH nie jest 22 (domyślnie), dodaj Port xx
w ~/.ssh/config
W moim przypadku (synology),
Host my_synology
Hostname xxxx.synology.me
IdentityFile ~/.ssh/id_rsa_xxxx
User myname
Port xx
Następnie Klonuj używając Host title w config. ("my_synology". aby uniknąć @ chopstik 's"*")
git clone my_synology:path/to/repo.git
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-31 15:25:44