it-swarm.com.de

Wie geben Sie den privaten SSH-Schlüssel an, der beim Ausführen des Shell-Befehls auf Git verwendet werden soll?

Eine eher ungewöhnliche Situation, aber ich möchte einen privaten SSH-Schlüssel angeben, der beim Ausführen eines Shell-Befehls (git) vom lokalen Computer verwendet werden soll.

Grundsätzlich so: 

git clone [email protected]:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

Oder noch besser (in Ruby):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone [email protected]:TheUser/TheProject.git")
end

Ich habe Beispiele für die Verbindung zu einem Remote-Server mit Net :: SSH gesehen, der einen angegebenen privaten Schlüssel verwendet, dies ist jedoch ein lokaler Befehl. Ist es möglich?

811
Christoffer

So etwas sollte funktionieren (vorgeschlagen von orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'

wenn Sie Subshells bevorzugen, können Sie Folgendes versuchen (obwohl es anfälliger ist):

ssh-agent $(ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git)

Git wird SSH aufrufen, das seinen Agenten anhand der Umgebungsvariablen findet. Dadurch wird der Schlüssel geladen.

Alternativ können Sie auch HOME einstellen, sofern Sie bereit sind, ein Verzeichnis einzurichten, das nur ein .ssh-Verzeichnis als HOME enthält. Diese kann entweder eine identity.pub oder eine config -Datei enthalten Einstellung von IdentityFile.

610

Keine dieser Lösungen funktionierte für mich. 

Stattdessen gehe ich auf @Martin v. Löwis Erwähnung ein, eine config-Datei für SSH festzulegen.

SSH sucht nach der ~/.ssh/config-Datei des Benutzers. Ich habe mein Setup als:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

Und ich füge ein Remote-Git-Repository hinzu:

git remote add Origin [email protected]:myrepo.git

Und dann funktionieren git-Befehle normal für mich.

git Push -v Origin master

ANMERKUNGEN

  • Der IdentitiesOnly yes ist erforderlich, um das SSH-Standardverhalten zu verhindern die Identitätsdatei zu senden, die dem Standarddateinamen für jedes Protokoll entspricht. Wenn Sie über eine Datei mit dem Namen ~/.ssh/id_rsa verfügen, wird diese Option VOR Ihrem ~/.ssh/id_rsa.github ohne diese Option versucht.

Verweise

999
HeyWatchThis

Die Vorschläge anderer Leute zu ~/.ssh/config sind besonders kompliziert. Es kann so einfach sein wie:

Host github.com
  IdentityFile ~/.ssh/github_rsa
367
philfreo

Ab Git 2.3.0 haben wir auch den einfachen Befehl (keine Konfigurationsdatei erforderlich):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone [email protected]:repo.git

Möglicherweise benötigen Sie einen Neustart für den SSH-Dienst auf Ihrem Computer.

295

Inhalte von my_git_ssh_wrapper:

#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2

Dann können Sie den Schlüssel verwenden, indem Sie Folgendes tun:

GIT_SSH=my_git_ssh_wrapper git clone [email protected]:TheUser/TheProject.git
126
Joe Block

Um Antworten und comments zusammenzufassen, können Sie git so einrichten, dass er verschiedene Schlüsseldateien verwendet und diese dann vergisst. Dadurch werden auch verschiedene Benutzer für denselben Host unterstützt (z. B. ein persönliches GitHub-Konto und ein Arbeitskonto) was auch unter Windows funktioniert, ist, ~/.ssh/config (oder c:\Users\<your user>\.ssh\config) zu bearbeiten und mehrere Identitäten anzugeben:

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

Um ein Projekt als persönlichen Benutzer zu klonen, führen Sie einfach den regulären Befehl git clone aus.

Um das Repo als workuser zu klonen, führen Sie git clone [email protected]:company/project.git aus.

81
Dan Dascalescu

Mit git 2.10+ (Q3 2016: veröffentlicht am 2. September 2016) haben Sie die Möglichkeit, config für GIT_SSH_COMMAND (und nicht nur eine Umgebungsvariable wie in Rober Jack WillAntworten )

Siehe Festschreiben 3c8ede3 (26 Jun 2016) von Nguyễn Thái Ngọc Duy (pclouds) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Festschreiben von dc21164 , 19. Juli 2016)

Eine neue Konfigurationsvariable core.sshCommand wurde zu .__ hinzugefügt. Geben Sie an, welchen Wert GIT_SSH_COMMAND pro Repository verwenden soll.

core.sshCommand:

Wenn diese Variable festgelegt ist, verwenden git fetch und git Push den angegebenen Befehl anstelle von ssh, wenn sie eine Verbindung zu einem Remote-System herstellen müssen.
Der Befehl hat dieselbe Form wie die Umgebungsvariable GIT_SSH_COMMAND und wird überschrieben, wenn die Umgebungsvariable festgelegt wird.

Es bedeutet, dass der git clone sein kann:

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone Host:repo.git
65
VonC

Wie hier angegeben: https://superuser.com/a/912281/607049

Sie können es per Repo konfigurieren:

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git Push
55
David

Ich habe mich für die Umgebungsvariable GIT_SSH entschieden ... Hier ist mein Wrapper, ähnlich dem von Joe Block von oben, behandelt aber jede Menge Argumente.

Datei ~/gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "[email protected]"

Fügen Sie dann in meiner .bashrc Folgendes hinzu:

export GIT_SSH=~/gitwrap.sh
30
Jamie

Eine bessere Idee, diesen Host oder diese IP-Adresse der .ssh/config-Datei hinzuzufügen:

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
thamster

Wenn Sie eine Verbindung mit github mit einer normalen Anforderung (git pull Origin master) herstellen müssen und der Host als * in ~/.ssh/config eingestellt ist, funktionierte für mich der andere Host (z. B. "github" oder "gb").

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx
7
chopstik

Viele dieser Lösungen wirkten verlockend. Ich fand jedoch den generischen Git-Wrapping-Skript-Ansatz unter dem folgenden Link am nützlichsten:

So legen Sie eine SSH-Schlüsseldatei mit dem Befehl git fest

Der Punkt ist, dass es keinen git Befehl wie den folgenden gibt:

git -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git

Alvins Lösung besteht darin, ein gut definiertes Bash-Wrapper-Skript zu verwenden, das diese Lücke schließt:

git.sh -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git

Wo git.sh ist:

#!/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 \[email protected]" > /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 "[email protected]"

Ich kann bestätigen, dass dies ein Problem mit der Benutzer-/Schlüsselerkennung für ein Remote-Bitbucket-Repo mit git remote update, git pull und git clone gelöst hat. Alle funktionieren jetzt in einem cron-Jobskript, das sonst Probleme beim Navigieren in der Limited-Shell hatte. Ich konnte dieses Skript auch aus R heraus aufrufen und trotzdem das gleiche cron-Ausführungsproblem lösen (z. B. system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")).

Nicht dass R das gleiche wie Ruby ist, aber wenn R es schaffen kann ... O :-)

7
Paul McMurdie

Wenn keine der anderen Lösungen hier für Sie geeignet ist und Sie mehrere ssh-Schlüssel erstellt haben, aber einfache Dinge wie diese nicht ausführen können

git pull

dann nehmen wir an, Sie haben zwei ssh-Schlüsseldateien wie 

id_rsa
id_rsa_other_key

dann versuchen Sie innerhalb des Git-Repos (CD dort hinein) zu versuchen:

eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

und stellen Sie außerdem sicher, dass der Standard-Benutzername und die Benutzer-ID von github korrekt sind:

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "[email protected]"

Weitere Informationen erhalten Sie unter https://Gist.github.com/jexchan/2351996 .

4
cgnorthcutt

GIT_SSH_COMMAND = "ssh -i/path/to/git-private-access-key" git-Klon $ git_repo

3
carlsborg

wenn sich in Ihrem Pfad ein Verzeichnis befindet, in dem Sie mit einer bestimmten Identifizierungsdatei signieren möchten, können Sie angeben, dass eine bestimmte Identifizierungsdatei über die Datei .ssh/config verwendet werden soll, indem Sie die Option ControlPath festlegen.

Host github.com
  ControlPath ~/Projects/work/**
  HostName github.com
  IdentityFile ~/.ssh/id_work
  User git

Dann verwendet ssh die angegebene Identitätsdatei, wenn git-Befehle unter dem angegebenen Arbeitspfad ausgeführt werden.

3
cristobal

Der Trick für mich war, git @ hostname anstelle von http: // hostname zu verwenden.

2
AmazingTurtle

In Windows mit Git Bash können Sie Folgendes hinzufügen, um ein Repository hinzuzufügen ssh-agent bash -c 'ssh-add "key-address"; git remote add Origin "rep-address"' Zum Beispiel: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add Origin [email protected]:test/test.git' Welcher private Schlüssel befindet sich in Laufwerk D: Ordnertest des Computers. Wenn Sie ein Repository klonen möchten, können Sie git remote add Origin mit git clone ändern.

Nachdem Sie dies bei Git Bash eingegeben haben, werden Sie nach der Passphrase gefragt!

Seien Sie sich bewusst, dass der private Schlüssel von openssh und der private Schlüssel von PuTTY unterschiedlich sind!

Wenn Sie Ihre Schlüssel mit Puttygen erstellt haben, müssen Sie Ihren privaten Schlüssel in openssh konvertieren!

2
Peyman Mahdavi

Sie können die Umgebungsvariable GIT_SSH verwenden. Sie müssen jedoch ssh und Optionen in ein Shell-Skript einbinden.

Siehe git manual: man git in Ihrer Befehls-Shell.

2
rudimeier

Hier ist der ssh-Schlüssel-Hack, den ich gefunden habe, als ich eine Lösung für dieses Problem fand:

Zum Beispiel haben Sie zwei verschiedene Schlüsselsätze:

key1, key1.pub, key2, key2.pub

Bewahren Sie diese Schlüssel in Ihrem .ssh-Verzeichnis auf

Fügen Sie nun in Ihrer Aliasdatei .bashrc oder .bash_profile diese Befehle hinzu

alias 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! Sie haben eine Tastenkombination zum Wechseln der Tasten, wann immer Sie möchten!

Hoffe, das funktioniert für dich. 

1
penduDev

für das gitlabRSAAuthentication yes 

Host gitlab.com
  RSAAuthentication yes
  IdentityFile ~/.ssh/your_private_key_name
  IdentitiesOnly yes

doc ist hier

1
Alupotha

Sie müssen eine ~/.ssh/config wie unten beschrieben erstellen

Host <Your bitbucket server>
User <userid>
Hostname <Your bitbucket server as above>
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa<file> This is your private key file

erlaubnis wie unten

-rw------- $HOME/.ssh/config

Fügen Sie Ihrem öffentlichen Schlüssel Ihren öffentlichen Schlüssel hinzu (cat ~/.ssh/id_rsa_pub [oder ähnlicher Name]).

und dann git klon wie folgt

git clone ssh://[email protected]/userid/test.git
0
gajanan malvade

Das Problem ist, wenn Sie verschiedene Remote-Repositorys auf demselben Host haben (sagen wir github.com) und mit ihnen über verschiedene SSH-Schlüssel (d. H. Verschiedene GitHub-Konten) interagieren möchten.

Um das zu tun:

1) Zuerst sollten Sie Ihre verschiedenen Schlüssel in der Datei ~/.ssh/config deklarieren.

# Key for usual repositories on github.com
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

# Key for a particular repository on github.com
Host XXX
HostName github.com
User git
IdentityFile ~/.ssh/id_other_rsa

Auf diese Weise verknüpfen Sie den zweiten Schlüssel mit einem neuen Anzeigenamen "XXX" für github.com.

2) Dann müssen Sie den Remote-Ursprung Ihres speziellen Repositorys ändern, damit es den angezeigten Namen verwendet, den Sie definiert haben.

Wechseln Sie innerhalb einer Eingabeaufforderung zu Ihrem lokalen Repository-Ordner und zeigen Sie den aktuellen Remote-Ursprung an:

>git remote -v
Origin  [email protected]:myuser/myrepo.git (fetch)
Origin  [email protected]:myuser/myrepo.git (Push)

Dann ändern Sie Origin mit:

>git remote set-url Origin [email protected]:myuser/myrepo.git
>git remote -v
Origin  [email protected]:myuser/myrepo.git (fetch)
Origin  [email protected]:myuser/myrepo.git (Push)

Jetzt können Sie mit der richtigen Taste automatisch schieben, holen ....

0
rodo

Wenn die SSH-Portnummer nicht 22 ist (Standard), fügen Sie Port xx in ~/.ssh/config hinzu.

In meinem Fall (Synologie)

Host my_synology
    Hostname xxxx.synology.me
    IdentityFile ~/.ssh/id_rsa_xxxx
    User myname
    Port xx

Dann klonen Sie den Host-Titel in config. ("my_synology"., um @chopstiks "*" zu vermeiden) 

git clone my_synology:path/to/repo.git
0
w..k

Ich verwende zsh und verschiedene Schlüssel werden automatisch für andere Zwecke (d. H. Den Zugriff auf Remote-Server) auf meinem Laptop in die zsh-Shell ssh-agent geladen. Ich habe die Antwort von @ Nick modifiziert und verwende sie für eines meiner Repos, das häufig aktualisiert werden muss. (In diesem Fall ist es meine dotfiles, die ich auf allen Maschinen dieselbe und aktuelle Version haben möchte, wo auch immer ich arbeite.)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • Einen SSH-Agenten erzeugen
  • Fügen Sie dem Agenten den schreibgeschützten Schlüssel hinzu
  • Wechsle das Verzeichnis in mein Git Repo
  • Wenn cd zum Repo-Verzeichnis erfolgreich ist, ziehen Sie aus dem Remote-Repo
  • Töte spawned ssh-agent. (Ich möchte nicht, dass sich viele Agenten in der Nähe aufhalten.)
0
sdkks

Wenn Sie wie ich sind, können Sie:

  • Halten Sie Ihre SSH-Schlüssel organisiert

  • Halten Sie Ihre Git-Klon-Befehle einfach

  • Verarbeiten Sie eine beliebige Anzahl von Schlüsseln für eine beliebige Anzahl von Repositorys.

  • Reduzieren Sie die Wartung Ihres SSH-Schlüssels.

Ich behalte meine Schlüssel in meinem ~/.ssh/keys-Verzeichnis.

Ich bevorzuge Konvention über Konfiguration.

Ich denke, Code ist Gesetz. Je einfacher es ist, desto besser.

SCHRITT 1 - Alias ​​erstellen

Fügen Sie diesen Alias ​​zu Ihrer Shell hinzu: alias git-clone='GIT_SSH=ssh_wrapper git clone'

SCHRITT 2 - Skript erstellen

Fügen Sie dieses ssh_wrapper -Skript Ihrem PATH hinzu:

#!/bin/bash
# Filename: ssh_wrapper

if [ -z ${SSH_KEY} ]; then
    SSH_KEY='github.com/l3x'  # <= Default key
fi
SSH_KEY="~/.ssh/keys/${SSH_KEY}/id_rsa"
ssh -i "${SSH_KEY}" "[email protected]"

BEISPIELE

Verwenden Sie den github.com/l3x-Schlüssel:

KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go

Im folgenden Beispiel wird außerdem die Taste github.com/l3x verwendet (standardmäßig):

git-clone https://github.com/l3x/learn-fp-go

Benutze bitbucket.org/lsheehan key:

KEY=bitbucket.org/lsheehan git-clone [email protected]:dave_andersen/exchange.git

ANMERKUNGEN

Ändern Sie den Standard-SSH_KEY im Skript ssh_wrapper in das, was Sie die meiste Zeit verwenden. Auf diese Weise müssen Sie die Variable KEY meistens nicht verwenden.

Sie denken vielleicht: "Hey! Mit einem Alias, einem Skript und einem Verzeichnis von Schlüsseln ist viel los", aber für mich ist das eine Konvention. Fast alle meine Arbeitsstationen (und Server für diese Angelegenheit) sind ähnlich konfiguriert.

Mein Ziel hier ist es, die Befehle, die ich regelmäßig ausführe, zu vereinfachen.

Meine Konventionen, z. B. Bash-Skripts, Aliasnamen usw., schaffen eine konsistente Umgebung und helfen mir, die Dinge einfach zu halten.

KISS und Namen sind wichtig.

Weitere Design-Tipps finden Sie in Kapitel 4 SOLID Design in Go aus meinem Buch: https://www.Amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/ dp/B0725B8MYW

Hoffentlich hilft das. - Lex

0
l3x