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?

Author: mikemaccana, 2010-12-30

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.

 551
Author: Martin v. Löwis,
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

 903
Author: HeyWatchThis,
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
 352
Author: philfreo,
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.

 252
Author: Robert Jack Will,
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
 124
Author: Joe Block,
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.

 77
Author: Dan Dascalescu,
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 i git push będą używać podanego polecenia zamiast ssh, gdy będą musiały połączyć się ze zdalnym systemem.
Polecenie ma taką samą postać jak zmienna środowiskowa GIT_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
 50
Author: VonC,
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
 43
Author: David,
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)
 28
Author: thamster,
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
 28
Author: Jamie,
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
 7
Author: chopstik,
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: -)

 7
Author: Paul McMurdie,
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ń.

 3
Author: rudimeier,
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

 2
Author: AmazingTurtle,
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!

 2
Author: Peyman Mahdavi,
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.)
 0
Author: sdkks,
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

Doc is here

 0
Author: Alupotha,
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
 0
Author: w..k,
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