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

1109

Eine vielleicht 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 git@github.com: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 Remoteserver mit Net :: SSH gesehen, der einen angegebenen privaten Schlüssel verwendet, aber dies ist ein lokaler Befehl. Ist es möglich?

Christoffer
quelle
28
Ich frage mich, warum dies so ungewöhnlich ist, dass Git keine -iOption wie diese sshhat.
Nick T
29
Mit Git 2.10 (Q3 2016) haben Sie auch eine neue Konfiguration : git config core.sshCommand 'ssh -i private_key_file'. Siehe meine Antwort unten
VonC
3
Meiner Meinung nach sollte die HeyWatchThis-Antwort die akzeptierte Antwort sein, da alle git-Befehle nach dem Setup wie gewohnt ausgeführt werden können, anstatt für jeden git-Befehl eine Unterschale erstellen zu müssen, wie es die aktuell akzeptierte Antwort erfordert.
Gloriphobie

Antworten:

800

So etwas sollte funktionieren (vorgeschlagen von orip):

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

Wenn Sie Unterschalen bevorzugen, können Sie Folgendes versuchen (obwohl es zerbrechlicher ist):

ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

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

Alternativ kann die Einstellung HOMEauch den Trick ausführen, vorausgesetzt, Sie sind bereit, ein Verzeichnis einzurichten, das nur ein .sshVerzeichnis enthält als HOME; Dies kann entweder eine identity.pub oder eine Konfigurationsdatei enthalten, die IdentityFile einstellt.

Martin v. Löwis
quelle
5
Dadurch wird der Schlüssel jedoch dauerhaft als akzeptierter SSH-Schlüssel hinzugefügt, oder? Ich möchte das vermeiden, damit theuser2 nicht mit den Projekten des Benutzers herumspielen kann. Es ist für eine Webanwendung, daher ist es nicht praktisch, verschiedene Betriebssystembenutzer zu verwenden, was die beste Option gewesen wäre.
Christoffer
28
Nein, wenn git abgeschlossen ist, wird ssh-agent beendet und der Schlüssel wird vergessen.
Martin v. Löwis
6
Dieser Befehl funktioniert nicht unter Windows Git Bash. Es heißt Syntaxfehler in der Nähe des unerwarteten Tokens 'ssh-add'
Mohit
116
Feste Befehlszeile (für Windows oder Linux) wäre etwa:ssh-agent bash -c 'ssh-add sshkey; git clone url'
orip
4
Das ssh-agent $(..) Syntax funktioniert bei mir nicht und ich bin mir nicht sicher, wie dies funktionieren soll: (ba) sh sollte zuerst die darin enthaltenen Befehle ausführen $(..)und dann ssh-agent mit der Ausgabe als Parameter ausführen .
Johannes 'Fisch' Ziemke
1200

Keine dieser Lösungen hat bei mir funktioniert.

Stattdessen gehe ich auf @Martin v. Löwis 'Erwähnung ein, eine configDatei für SSH einzurichten .

SSH sucht nach der ~/.ssh/configDatei des Benutzers . Ich habe meine Einstellungen wie folgt:

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 git@gitserv:myrepo.git

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

git push -v origin master

ANMERKUNGEN

  • Dies IdentitiesOnly yesist erforderlich, um zu verhindern , dass das SSH-Standardverhalten beim Senden der Identitätsdatei mit dem Standarddateinamen für jedes Protokoll übereinstimmt. Wenn Sie eine Datei mit dem Namen haben ~/.ssh/id_rsa, die VOR Ihrer Verwendung ~/.ssh/id_rsa.githubohne diese Option ausprobiert wird .

Verweise

HeyWatchThis
quelle
17
Ich habe festgestellt, dass Sie, wenn Sie mehrere Schlüssel mit .ssh / config angeben, den Namen des Host-Freundes in Zeile "Host" als Teil des Befehls "git remote add" verwenden müssen. Wenn die Zeile "Host stg" lautet, müssen Sie git remote verwenden. Fügen Sie <someName> user @ stg: /path_to_git_repo.git "hinzu. Wenn Sie einen genauen Servernamen wie [email protected]: /path_to_git_repo.git, die Konfigurationsdatei, verwenden wird nicht von git ausgewählt. Daher wird die private Schlüsseldatei nicht richtig ausgewählt. Ich habe dies versucht, indem ich denselben Inhalt an github und heroku gesendet habe, und funktioniert nur, wenn Sie in "git remote add" einen freundlichen Namen angeben
Gopinath MR
2
Ich war mir nicht sicher über den Host für Github. Ich habe diesen Link gefunden: gist.github.com/jexchan/2351996 .
Karsten
1
Werfen
1
Sie können Host remote.server.comdie ursprüngliche URL verwenden und weiterhin verwenden
MauganRa
5
Dies funktionierte bei mir nach zwei Änderungen. Wenn die Konfigurationsdatei neu ist, vergessen Sie dies nicht chmod 600 ~/.ssh/config(siehe hier ). Und wenn Sie GitHub verwenden, ersetzen Sie Host gitservdurch Host github.com, lassen Sie es weg Hostname remote.server.comund fügen Sie Remote mit hinzu git remote add origin [email protected]:user_name/repo_name.git.
Miguelmorin
479

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

GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git
Robert Jack Will
quelle
3
Ich bekomme cannot run ssh -i /home/vagrant/.ssh/git: No such file or directoryobwohl es existiert 444 Nov 16 18:12 /home/vagrant/.ssh/gitausls -l /home/vagrant/.ssh/git
ted
3
@ted: chmod 400 /home/vagrant/.ssh/git
Yash
8
Schöne und einfache Lösung. Ich schlage vor, einen Alias ​​zu erstellen, wenn Sie dies häufig tun müssen.
Lasse Meyer
5
Vergiss es nicht chmod 400 <path-to-private-key-file>. Andernfalls kann der Befehl git ohne spezielle Fehlermeldung fehlschlagen ...
Eonil
5
Es wäre gut, wenn diese Antwort auch enthalten wäre -o IdentitiesOnly=yes, um sicherzustellen, dass der mit angegebene Schlüssel -iverwendet wird (im Gegensatz zu einem Schlüssel vom SSH-Agenten).
Robinst
423

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

Host github.com
  IdentityFile ~/.ssh/github_rsa
Philfreo
quelle
30
Sie brauchen auch die IdentitiesOnlyOption.
Flimm
4
@EnzeChi Sie können mehrere Github-Konten haben, indem Sie die Fernbedienungen manipulieren : git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git. Dann sieht Host personal HostName github.com ... Host corporate HostName github.com
Ihre
@EnzeChi Ich mache etwas Ähnliches, so dass ich 2 verschiedene SSH-Tasten verwende - eine zum Abrufen und die andere zum Drücken. Der Abruf hat keine Passphrase. Der Push macht.
Emory
144

Inhalt 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 git@github.com:TheUser/TheProject.git
Joe Block
quelle
4
Sehr gute Lösung, wenn Sie mehr als ein Konto in derselben Domain haben, was andere Lösungen nicht gut handhaben
Beka
1
Schöne Lösung. Sie können dies auch mit> GIT_SSH = my_git_ssh_wrapper vereinfachen. Git Klon [email protected]: TheUser / TheProject.git
Shiva
2
Diese Lösung deckt auch Situationen ab, in denen Sie Git von einem Konto ohne Ausgangsverzeichnis verwenden möchten.
Piotrekkr
Fantastisch. Sie können diese Methode auch für private Server verwenden:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
Tonne
1
Dies ist der einzige Weg, der für mich in einer Cygwin-Umgebung
funktioniert hat
113

Mit git 2.10+ (Q3 2016: veröffentlicht am 2. September 2016) haben Sie die Möglichkeit, eine Konfiguration für GIT_SSH_COMMAND(und nicht nur eine Umgebungsvariable, wie in der Antwort von Rober Jack Will beschrieben , festzulegen )

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

Eine neue Konfigurationsvariable core.sshCommandwurde hinzugefügt, um anzugeben, welcher Wert GIT_SSH_COMMANDpro Repository verwendet werden soll.

core.sshCommand:

Wenn diese Variable festgelegt ist git fetchund git pushden angegebenen Befehl verwendet, anstatt ssheine Verbindung zu einem Remote-System herzustellen.
Der Befehl hat dieselbe Form wie die GIT_SSH_COMMANDUmgebungsvariable und wird überschrieben, wenn die Umgebungsvariable festgelegt wird.

Es bedeutet, dass das sein git clonekann:

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

Sie können es sogar für nur einen Befehl festlegen:

git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

Das ist einfacher als eine Einstellung GIT_SSH_COMMANDUmgebungsvariable, die auf Windows, wie festgestellt durch Mátyás Kuti-Kreszács wäre

set "GIT_SSH_COMMAND=ssh -i private_key_file"
VonC
quelle
@ Flimm Veröffentlichungstermine: calendar.google.com/calendar/…
VonC
Es wurde veröffentlicht.
Flimm
4
Funktioniert. Leute sollten dies als die beste Antwort betrachten. Nach der Ausgabe kann es informativ sein, die .git / config-Datei mit einer Version zu unterscheiden, die zuvor nach / tmp kopiert wurde. Ein neuer Eintrag wurde erstellt: sshCommand = ... Für das, was es wert ist, habe ich 'git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile" verwendet.
WeakPointer
1
@Spanky Sie können den Inline-Befehl ausführen, git -c core.sshCommand="ssh -i private_key_file" clone host:repo.gitgefolgt vom Konfigurationssatzgit config core.sshCommand 'ssh -i private_key_file'
dav_i
1
Dies ist definitiv die beste Antwort!
Wagner Patriota
111

Um Antworten und Kommentare zusammenzufassen : Der beste Weg, um git so einzurichten, dass verschiedene Schlüsseldateien verwendet und dann vergessen werden. Dies unterstützt auch verschiedene Benutzer für denselben Host (z. B. ein persönliches GitHub-Konto und ein funktionierendes Konto), das unter Windows funktioniert Außerdem müssen mehrere Identitäten bearbeitet ~/.ssh/config(oder c:\Users\<your user>\.ssh\config) und angegeben werden:

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 Ihren persönlichen Benutzer zu klonen, führen Sie einfach den regulären aus git clone Befehl aus.

workuserFühren Sie run aus, um das Repo als zu klonen git clone git@github-work:company/project.git.

Dan Dascalescu
quelle
3
Ich habe Sie abgelehnt, weil alles, was Sie sagen, bereits in den obigen Antworten und in meinen Augen noch deutlicher behandelt wird. Warum definieren Sie beispielsweise den Benutzer genau für d dandv bzw. workuser?
Hroptatyr
2
Sie haben eine 4 Jahre alte Frage ohne neue Informationen beantwortet und behaupten, dass Ihre Antwort "der beste Weg" ist. Darüber hinaus haben Sie andere Benutzer herabgestuft und belästigt, um ihre Antwort zu entfernen ... nur um Ihre Antwort zu verbessern.
Rudimeier
@hroptatyr: Ich habe mein Beispiel verwendet dandvund workuserunterstützt, "zB ein persönliches GitHub-Konto und ein Arbeitskonto". dandvist mein GitHub-Benutzername.
Dan Dascalescu
12
Ich denke, es ist eine bessere Antwort als die von @ thamster, schon allein deshalb, weil es Host-Aliase erklärt.
David Moles
2
Ich mag diese Antwort. Bei mir funktioniert dies jedoch nur, wenn ich IdentitiesOnly yesmeiner SSH-Konfigurationsdatei etwas hinzufüge .
Winni2k
75

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

Sie können es pro Repo konfigurieren:

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
David
quelle
1
Was macht -F /dev/nulldas Soweit ich sehen kann, wird dadurch configFile vom ~/.ssh/configStandard geändert, aber warum ist das erwünscht? Um einen Sandbox-Befehl sicherzustellen?
Dominic
3
linuxcommand.org/man_pages/ssh1.html gibt keine Konfigurationsdatei an. Wenn also git ssh ausführt , wird keine Konfigurationsdatei übergeben (tatsächlich handelt es sich um eine Art Sandbox-Modus, ignorieren Sie einfach die Standardoptionen für die Benutzerkonfiguration). Der ursprüngliche Thread im Superuser hat Weitere Informationen zu -F
David
1
Der, den ich gesucht habe. Vielen Dank!
lostcitizen
AAAAA + -Lösung für die Arbeit in einer Kuber-Umgebung. Vielen Dank!
Cobra vs Ninja
1
Hallo Wissen Sie, wie Sie dies auf ein Submodul übertragen können?
Arka Prava Basu
38

Das Problem besteht darin, dass Sie verschiedene Remote-Repositorys auf demselben Host haben (z. B. github.com) und mit verschiedenen SSH-Schlüsseln (dh verschiedenen GitHub-Konten) mit ihnen interagieren möchten .

Um das zu tun:

  1. Zuerst sollten Sie Ihre verschiedenen Schlüssel in der ~/.ssh/configDatei 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. Anschließend müssen Sie den Remote-Ursprung Ihres bestimmten Repositorys so ändern, dass der soeben definierte Anzeigename verwendet wird.

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

    >git remote -v
    origin  git@github.com:myuser/myrepo.git (fetch)
    origin  git@github.com:myuser/myrepo.git (push)

    Dann ändern Sie den Ursprung mit:

    >git remote set-url origin git@XXX:myuser/myrepo.git
    >git remote -v
    origin  git@XXX:myuser/myrepo.git (fetch)
    origin  git@XXX:myuser/myrepo.git (push)

    Jetzt können Sie automatisch mit der richtigen Taste drücken, holen ....

rodzmkii
quelle
1
Dies ist meiner Meinung nach die "richtigste" Antwort, bei der Sie Verbindungen und Schlüssel in Ihrer SSH-Konfigurationsdatei organisieren, die bewährte Methoden sind und langfristig unterstützt werden können.
Jamescampbell
Andere Lösungen scheinen Problemumgehungen zu sein. Dies nutzt die großartige Funktion, die das Tool unterstützt.
Craig.C
Super, genau das, wonach ich gesucht habe, danke !!
magikMaker
37
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

oder

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push
Carlsborg
quelle
Dieser hat für mich gearbeitet.
mohammed_ayaz
36

Viel bessere Idee, diesen Host oder diese IP .ssh/configwie folgt zur 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)
Thamster
quelle
1
Das ist nützlich, aber Sie können den Repo-Schlüssel für alle Interaktionen mit diesem Hostnamen verwenden. Wenn sich auf demselben Server andere Repos befinden, für die andere Schlüssel erforderlich sind, ist es besser, einen Wrapper zu verwenden und git anzuweisen, ihn mit GIT_SSH zu verwenden.
Joe Block
11
Das ist nicht unbedingt wahr. Ich verwende mehrere Schlüssel für Github - einen für die Arbeit und einen für mein persönliches Konto. Sie müssen keinen Domainnamen für "Host" eingeben. Sie können einen beliebigen Alias ​​eingeben. Zum Beispiel verwende ich gh-home und gh-work als meine Hostnamen und wenn ich klone, verwende ich zum Beispiel git clone git@gh-work:repo/project.git In meiner ~ / .ssh / config habe ich zwei Abschnitte, die beide github.com für Hostname verwenden. Sie haben nur unterschiedliche IdentityFile und Host
Blockloop
@ brettof86 Diese Strategie funktioniert größtenteils, aber was machst du, wenn ein Repository, das du auscheckst, von einem Juwel abhängt, das auch auf Github gehostet wird? Der Verweis auf das Github-Repo in der Gemfile enthält nicht Ihren "Alias", naja, es sei denn, Sie möchten Dinge für andere Entwickler des Projekts brechen ...
ktec
@ brettof86 Ich habe auch zwei verschiedene Github-Konten (Arbeit, Zuhause), aber ich kann das Beispiel nicht für mich arbeiten lassen. Können Sie ein Beispiel für zwei veröffentlichen?
Climbs_lika_Spyder
@Climbs_lika_Spyder hier ist , was in meinem ist ~/.ssh/config pastebin.com/8rYn7yCi
blockloop
32

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

Datei ~ / gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"

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

export GIT_SSH=~/gitwrap.sh
Jamie
quelle
Ich habe dies auf .bashrc eingestellt. Wenn ich mich jedoch bei der openshift-Instanz anmelde, scheint sie nicht aufgerufen zu werden. Vermisse ich etwas
Jigar Shah
Es schlägt mit einem Fehler für mich fehl. Es kann das Skriptereignis nicht finden, obwohl es dort ist. Ich bin nicht sicher, was los ist. Fehler: Kann /tmp/gitwrap.sh nicht ausführen: Keine solche Datei oder kein solches Verzeichnis
ap1234
Wenn Sie „Keine solche Datei oder das Verzeichnis“ Fehler konfrontiert, legte vollständigen Pfad gitwrap.shzum Beispiel/home/ubuntu/gitwrap.sh
Tahir Akhtar
Vielleicht möchten Sie -o StrictHostKeyChecking=nodem Befehl ssh hinzufügen
dan-man
12

Wenn keine der anderen Lösungen hier für Sie funktioniert und Sie mehrere SSH-Schlüssel erstellt haben, aber immer noch keine einfachen Dinge wie tun können

git pull

dann unter der Annahme, dass Sie zwei SSH-Schlüsseldateien wie haben

id_rsa
id_rsa_other_key

Versuchen Sie dann im Git-Repo:

# Run these commands INSIDE your git directory
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

und stellen Sie außerdem sicher, dass Ihr Github-Standardbenutzername und Ihre Benutzer-ID korrekt sind:

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

Weitere Informationen finden Sie unter https://gist.github.com/jexchan/2351996 .

cgnorthcutt
quelle
Beachten Sie, wenn Sie erhalten Could not open a connection to your authentication agent., versuchen Sie es $ eval `ssh-agent -s`und versuchen Sie es erneut.
cgnorthcutt
1
Für diejenigen, die verloren sind, hat der ssh-addBefehlstrick für mich funktioniert. Fügt den Identitätsschlüssel zur Liste derjenigen hinzu, die bei der Authentifizierung von ssh ausprobiert werden. Das hat bei mir gut funktioniert!
Ben Cartwright
Warum ist es Ihrer Meinung nach wichtig, in welchem ​​Verzeichnis Sie arbeiten ssh-add?
Tripleee
@ BenCartwright Da Sie lokale Einstellungen ändern, nicht globale Einstellungen. Dieser Ansatz ändert .gitinnerhalb des Repos nicht das Git-Programm global. Sie können --globaldamit den globalen Benutzernamen und die E-Mail-Adresse festlegen.
cgnorthcutt
11

Wenn Sie mit einer normalen Anfrage an Github anschließen müssen ( git pull origin master), Einstellen des Host als *in ~/.ssh/configfür mich gearbeitet, andere Host (sagen wir, „GitHub“ oder „GB“) funktionierte nicht.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx
Essstäbchen
quelle
Könnte dann auch die gesamte "Host *" - Zeile weglassen.
Lionello
1
Es hat wahrscheinlich nicht funktioniert, weil es nicht mit Ihrer Remote-URL übereinstimmt. Wenn Sie verwenden möchten Host my-host-alias, müssen Sie festlegen remote.origin.url=git@my-host-alias:[username]/[repo].git.
David Moles
11

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

So geben Sie mit dem gitBefehl eine SSH-Schlüsseldatei an

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

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Alvins Lösung besteht darin, ein genau definiertes Bash-Wrapper-Skript zu verwenden, das diese Lücke füllt:

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Wo git.shist:

#!/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 "$@"

Ich kann bestätigen , dass dies ein Problem gelöst , ich war für einen Remote - bitbucket Repo mit Benutzer / zur Erkennung mit mit git remote update, git pullund git clone; All dies funktioniert jetzt einwandfrei in einem cronJobskript, das ansonsten Probleme beim Navigieren in der Limited-Shell hatte. Ich konnte dieses Skript auch aus R heraus aufrufen und trotzdem genau das gleiche cronAusführungsproblem lösen (z system("bash git.sh -i ~/.ssh/thatuserkey.pem pull"). B. ).

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

Paul McMurdie
quelle
1
Sieht toll aus! Ich werde dies testen und zurück antworten.
BlueBird
3
Wie ist das, abgesehen von der Syntax, besser als GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone [email protected]:/git/repo.gitgemäß der Antwort von Robert Jack Will ?
David Moles
6

Wenn Sie ein Verzeichnis auf Ihrem Pfad haben, in dem Sie mit einer bestimmten Identifizierungsdatei signieren möchten, können Sie angeben, dass eine bestimmte Identifizierungsdatei über die .ssh / config-Datei verwendet werden soll, indem Sie ControlPathz.

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

Anschließend sshwird die angegebene Identitätsdatei verwendet, wenn Git-Befehle unter dem angegebenen Arbeitspfad ausgeführt werden.

cristobal
quelle
Später haben Sie herausgefunden, dass Sie auch die Eigenschaften ControlMaster autound festlegen können ControlPersist yes, damit Sie das Kennwort nicht jedes Mal neu eingeben müssen. Gefunden die Info in diesem Artikel
Cristobal
3

Sie müssen eine ~ / .ssh / config wie unten 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 Ihren öffentlichen Schlüssel zu Ihrem Git hinzu (cat ~ / .ssh / id_rsa_pub [oder ähnlicher Name])

und dann git Klon wie unten

git clone ssh://blahblah@blah.com/userid/test.git
Gajanan Malvade
quelle
3

Viele gute Antworten, aber einige von ihnen setzen Vorkenntnisse in der Verwaltung voraus.

Ich denke , es ist wichtig zu betonen ausdrücklich , dass , wenn Sie Ihr Projekt durch Klonen der Web - URL gestartet - https://github.com/<user-name>/<project-name>.git
dann müssen Sie sicherstellen, dass der url Wert unter [remote "origin"]in der .git/config auf die SSH - URL geändert wurde (Codeblock weiter unten).

Stellen Sie außerdem sicher, dass Sie sshCommmandFolgendes hinzufügen :

user@workstation:~/workspace/project-name/.git$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    sshCommand = ssh -i ~/location-of/.ssh/private_key -F /dev/null <--Check that this command exist
[remote "origin"]
    url = git@github.com:<user-name>/<project-name>.git  <-- Make sure its the SSH URL and not the WEB URL
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

Lesen Sie hier mehr darüber .

RtmY
quelle
1
Vielen Dank, ich habe so viel Zeit damit verbracht herauszufinden, warum Git den SSH-Schlüssel nicht verwendet. Ich verstehe nicht, warum Github in der Klon-Schaltfläche standardmäßig die https-URL angibt.
Chakradar Raju
2

In Windows mit Git Bash können Sie ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' beispielsweise Folgendes verwenden, um ein Repository hinzuzufügen : 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. Auch wenn Sie ein Repository klonen möchten, können Sie ändern , git remote add originmit git clone.

Nachdem Sie dies in Git Bash eingegeben haben, werden Sie nach einer 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!

Peyman Mahdavi
quelle
1

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

Siehe Git-Handbuch: man gitin Ihrer Befehlsshell.

rudimeier
quelle
1

Ich verwende zshund verschiedene Schlüssel werden ssh-agentautomatisch für andere Zwecke (dh den Zugriff auf Remote-Server) auf meinem Laptop in meine zsh-Shell geladen . Ich habe die Antwort von @ Nick geändert und verwende sie für eines meiner Repos, das häufig aktualisiert werden muss. (In diesem Fall dotfilesmöchte ich auf allen Computern, wo immer ich arbeite, die gleiche und neueste Version.)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • Bringe einen SSH-Agenten hervor
  • Fügen Sie dem Agenten einen schreibgeschützten Schlüssel hinzu
  • Wechseln Sie in mein Git-Repo
  • Wenn cddas Repo-Verzeichnis erfolgreich ist, ziehen Sie vom Remote-Repo
  • Töte den gespawnten SSH-Agenten. (Ich würde nicht wollen, dass viele Agenten herumlungern.)
sdkks
quelle
1

für das gitlab RSAAuthentication yes

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

doc ist hier

Alupotha
quelle
wird auf dem von Ihnen angegebenen Link nicht mehr erwähnt
rbennell
1

Damit die Umgebungsvariable GIT_SSH_COMMAND unter Windows funktioniert, anstatt:

set GIT_SSH_COMMAND="ssh -i private_key_file"

Verwenden:

set "GIT_SSH_COMMAND=ssh -i private_key_file"

Das Zitat muss so sein

set "variable=value" 

Einige Backgorund: https://stackoverflow.com/a/34402887/10671021

Mátyás Kuti-Kreszács
quelle
0

Wenn SSH - Port - Nummer nicht 22 (default) ist, fügen Sie Port xxin~/.ssh/config

In meinem Fall (Synologie),

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

Klonen Sie dann mit dem Host-Titel in der Konfiguration. ("my_synology". um @chopstiks "*" zu vermeiden)

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

Wenn du wie ich bist, kannst du:

  • Halten Sie Ihre SSH-Schlüssel organisiert

  • Halten Sie Ihre Git-Klon-Befehle einfach

  • Behandeln 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/keysVerzeichnis.

Ich bevorzuge Konventionen gegenüber Konfigurationen.

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

SCHRITT 1 - Alias ​​erstellen

Fügen Sie diesen Alias ​​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}" "$@"

BEISPIELE

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

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

Im folgenden Beispiel wird auch der Schlüssel github.com/l3x verwendet (standardmäßig):

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

Verwenden Sie den Schlüssel bitbucket.org/lsheehan:

KEY=bitbucket.org/lsheehan git-clone git@bitbucket.org:dave_andersen/exchange.git

ANMERKUNGEN

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

Sie mögen denken: "Hey! Das ist viel los mit einem Alias, einem Skript und einem Verzeichnis von Schlüsseln", aber für mich ist es Konvention. Fast alle meine Workstations (und Server) sind ähnlich konfiguriert.

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

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

KUSS und Namen sind wichtig.

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

Ich hoffe, das hilft. - Lex

l3x
quelle
0

Sie können das Paket sshmulti npm ausprobieren, um mehrere ssh-Schlüssel zu verwalten.

Anto Khan
quelle
0

Das Problem bei dieser Methode besteht zumindest bei der Ausführung mit bash.exe unter Windows darin, dass jedes Mal ein neuer Prozess erstellt wird, der inaktiv bleibt.

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

Wenn Sie dies für die planmäßige Synchronisierung von Repo verwenden möchten, müssen Sie am Ende "&& ssh-agent -k" hinzufügen.

Etwas wie:

ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k' 

ssh-agent -k beendet den Prozess, wenn er abgeschlossen ist.

Mike Zygal
quelle
0

Ich musste nur den Schlüssel hinzufügen und dann den Git-Klon erneut ausführen.

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git
Rafael Corrêa Gomes
quelle
-1

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

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

key1, key1.pub, key2, key2.pub

Bewahren Sie diese Schlüssel in Ihrem .sshVerzeichnis auf

Fügen Sie nun in Ihrer .bashrcoder .bash_profileAlias-Datei 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 Verknüpfung zum Wechseln der Tasten, wann immer Sie möchten!

Hoffe das funktioniert bei dir.

penduDev
quelle