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?
-i
Option wie diesessh
hat.git config core.sshCommand 'ssh -i private_key_file'
. Siehe meine Antwort untenAntworten:
So etwas sollte funktionieren (vorgeschlagen von orip):
Wenn Sie Unterschalen bevorzugen, können Sie Folgendes versuchen (obwohl es zerbrechlicher ist):
Git ruft SSH auf, das seinen Agenten anhand der Umgebungsvariablen findet. Dadurch wird wiederum der Schlüssel geladen.
Alternativ kann die Einstellung
HOME
auch den Trick ausführen, vorausgesetzt, Sie sind bereit, ein Verzeichnis einzurichten, das nur ein.ssh
Verzeichnis enthält alsHOME
; Dies kann entweder eine identity.pub oder eine Konfigurationsdatei enthalten, die IdentityFile einstellt.quelle
ssh-agent bash -c 'ssh-add sshkey; git clone url'
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 .Keine dieser Lösungen hat bei mir funktioniert.
Stattdessen gehe ich auf @Martin v. Löwis 'Erwähnung ein, eine
config
Datei für SSH einzurichten .SSH sucht nach der
~/.ssh/config
Datei des Benutzers . Ich habe meine Einstellungen wie folgt:Und ich füge ein Remote-Git-Repository hinzu:
Und dann funktionieren Git-Befehle für mich normal.
ANMERKUNGEN
IdentitiesOnly yes
ist 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.github
ohne diese Option ausprobiert wird .Verweise
quelle
Host remote.server.com
die ursprüngliche URL verwenden und weiterhin verwendenchmod 600 ~/.ssh/config
(siehe hier ). Und wenn Sie GitHub verwenden, ersetzen SieHost gitserv
durchHost github.com
, lassen Sie es wegHostname remote.server.com
und fügen Sie Remote mit hinzugit remote add origin [email protected]:user_name/repo_name.git
.Ab Git 2.3.0 haben wir auch den einfachen Befehl (keine Konfigurationsdatei erforderlich):
quelle
cannot run ssh -i /home/vagrant/.ssh/git: No such file or directory
obwohl es existiert444 Nov 16 18:12 /home/vagrant/.ssh/git
ausls -l /home/vagrant/.ssh/git
chmod 400 <path-to-private-key-file>
. Andernfalls kann der Befehl git ohne spezielle Fehlermeldung fehlschlagen ...-o IdentitiesOnly=yes
, um sicherzustellen, dass der mit angegebene Schlüssel-i
verwendet wird (im Gegensatz zu einem Schlüssel vom SSH-Agenten).Die Vorschläge anderer Leute
~/.ssh/config
sind besonders kompliziert. Es kann so einfach sein wie:quelle
IdentitiesOnly
Option.git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git
. Dann siehtHost personal HostName github.com ... Host corporate HostName github.com
Inhalt von my_git_ssh_wrapper:
Dann können Sie den Schlüssel verwenden, indem Sie Folgendes tun:
quelle
GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
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)Es bedeutet, dass das sein
git clone
kann:Sie können es sogar für nur einen Befehl festlegen:
Das ist einfacher als eine Einstellung
GIT_SSH_COMMAND
Umgebungsvariable, die auf Windows, wie festgestellt durch Mátyás Kuti-Kreszács wärequelle
git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git
gefolgt vom Konfigurationssatzgit config core.sshCommand 'ssh -i private_key_file'
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
(oderc:\Users\<your user>\.ssh\config
) und angegeben werden:Um ein Projekt als Ihren persönlichen Benutzer zu klonen, führen Sie einfach den regulären aus
git clone
Befehl aus.workuser
Führen Sie run aus, um das Repo als zu klonengit clone git@github-work:company/project.git
.quelle
dandv
undworkuser
unterstützt, "zB ein persönliches GitHub-Konto und ein Arbeitskonto".dandv
ist mein GitHub-Benutzername.IdentitiesOnly yes
meiner SSH-Konfigurationsdatei etwas hinzufüge .Wie hier angegeben: https://superuser.com/a/912281/607049
Sie können es pro Repo konfigurieren:
quelle
-F /dev/null
das Soweit ich sehen kann, wird dadurch configFile vom~/.ssh/config
Standard geändert, aber warum ist das erwünscht? Um einen Sandbox-Befehl sicherzustellen?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:
Zuerst sollten Sie Ihre verschiedenen Schlüssel in der
~/.ssh/config
Datei deklarieren .Auf diese Weise verknüpfen Sie den zweiten Schlüssel mit einem neuen Anzeigenamen "XXX" für github.com.
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:
Dann ändern Sie den Ursprung mit:
Jetzt können Sie automatisch mit der richtigen Taste drücken, holen ....
quelle
oder
quelle
Viel bessere Idee, diesen Host oder diese IP
.ssh/config
wie folgt zur Datei hinzuzufügen :quelle
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~/.ssh/config
pastebin.com/8rYn7yCiIch 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
Fügen Sie dann in meiner .bashrc Folgendes hinzu:
quelle
gitwrap.sh
zum Beispiel/home/ubuntu/gitwrap.sh
-o StrictHostKeyChecking=no
dem Befehl ssh hinzufügenWenn 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
dann unter der Annahme, dass Sie zwei SSH-Schlüsseldateien wie haben
Versuchen Sie dann im Git-Repo:
und stellen Sie außerdem sicher, dass Ihr Github-Standardbenutzername und Ihre Benutzer-ID korrekt sind:
Weitere Informationen finden Sie unter https://gist.github.com/jexchan/2351996 .
quelle
Could not open a connection to your authentication agent.
, versuchen Sie es$ eval `ssh-agent -s`
und versuchen Sie es erneut.ssh-add
Befehlstrick 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!ssh-add
?.git
innerhalb des Repos nicht das Git-Programm global. Sie können--global
damit den globalen Benutzernamen und die E-Mail-Adresse festlegen.Wenn Sie mit einer normalen Anfrage an Github anschließen müssen (
git pull origin master
), Einstellen des Host als*
in~/.ssh/config
für mich gearbeitet, andere Host (sagen wir, „GitHub“ oder „GB“) funktionierte nicht.quelle
Host my-host-alias
, müssen Sie festlegenremote.origin.url=git@my-host-alias:[username]/[repo].git
.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
git
Befehl eine SSH-Schlüsseldatei anDer Punkt ist, dass es keinen
git
Befehl wie den folgenden gibt:Alvins Lösung besteht darin, ein genau definiertes Bash-Wrapper-Skript zu verwenden, das diese Lücke füllt:
Wo
git.sh
ist: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 pull
undgit clone
; All dies funktioniert jetzt einwandfrei in einemcron
Jobskript, das ansonsten Probleme beim Navigieren in der Limited-Shell hatte. Ich konnte dieses Skript auch aus R heraus aufrufen und trotzdem genau das gleichecron
Ausführungsproblem lösen (zsystem("bash git.sh -i ~/.ssh/thatuserkey.pem pull")
. B. ).Nicht dass R dasselbe ist wie Ruby, aber wenn R es kann ... O :-)
quelle
GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone [email protected]:/git/repo.git
gemäß der Antwort von Robert Jack Will ?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
ControlPath
z.Anschließend
ssh
wird die angegebene Identitätsdatei verwendet, wenn Git-Befehle unter dem angegebenen Arbeitspfad ausgeführt werden.quelle
ControlMaster auto
und festlegen könnenControlPersist yes
, damit Sie das Kennwort nicht jedes Mal neu eingeben müssen. Gefunden die Info in diesem ArtikelSie müssen eine ~ / .ssh / config wie unten erstellen
Erlaubnis wie unten
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
quelle
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
sshCommmand
Folgendes hinzufügen :Lesen Sie hier mehr darüber .
quelle
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 origin
mitgit 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!
quelle
Sie können die Umgebungsvariable GIT_SSH verwenden. Sie müssen jedoch ssh und options in ein Shell-Skript einbinden.
Siehe Git-Handbuch:
man git
in Ihrer Befehlsshell.quelle
Ich verwende
zsh
und verschiedene Schlüssel werdenssh-agent
automatisch 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 Falldotfiles
möchte ich auf allen Computern, wo immer ich arbeite, die gleiche und neueste Version.)cd
das Repo-Verzeichnis erfolgreich ist, ziehen Sie vom Remote-Repoquelle
für das gitlab
RSAAuthentication yes
doc ist hier
quelle
Damit die Umgebungsvariable GIT_SSH_COMMAND unter Windows funktioniert, anstatt:
Verwenden:
Das Zitat muss so sein
Einige Backgorund: https://stackoverflow.com/a/34402887/10671021
quelle
Wenn SSH - Port - Nummer nicht 22 (default) ist, fügen Sie
Port xx
in~/.ssh/config
In meinem Fall (Synologie),
Klonen Sie dann mit dem Host-Titel in der Konfiguration. ("my_synology". um @chopstiks "*" zu vermeiden)
quelle
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/keys
Verzeichnis.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:
BEISPIELE
Verwenden Sie den Schlüssel github.com/l3x:
Im folgenden Beispiel wird auch der Schlüssel github.com/l3x verwendet (standardmäßig):
Verwenden Sie den Schlüssel bitbucket.org/lsheehan:
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
quelle
Sie können das Paket sshmulti npm ausprobieren, um mehrere ssh-Schlüssel zu verwalten.
quelle
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.
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 -k beendet den Prozess, wenn er abgeschlossen ist.
quelle
Ich musste nur den Schlüssel hinzufügen und dann den Git-Klon erneut ausführen.
quelle
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
.ssh
Verzeichnis aufFügen Sie nun in Ihrer
.bashrc
oder.bash_profile
Alias-Datei diese Befehle hinzualias 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.
quelle