ssh
hat die -i
Option anzugeben, welche private Schlüsseldatei für die Authentifizierung verwendet werden soll:
-i identity_file
Wählt eine Datei aus, aus der die Identität (privater Schlüssel) für die RSA- oder DSA-Authentifizierung gelesen wird. Der Standard ist
~/.ssh/identity
für Protokollversion 1 und~/.ssh/id_rsa
und~/.ssh/id_dsa
für Protokollversion 2. Identität Dateien auch auf einer Pro-Host - Basis in der Konfigurationsdatei angegeben werden. Es ist möglich, mehrere-i
Optionen (und mehrere in den Konfigurationsdateien angegebene Identitäten) festzulegen.
Gibt es eine ähnliche Möglichkeit, festzustellen, git
welche private Schlüsseldatei auf einem System mit mehreren privaten Schlüsseln im ~/.ssh
Verzeichnis verwendet werden soll?
ssh
git
authentication
private-key
jrdioko
quelle
quelle
Antworten:
In
~/.ssh/config
hinzufügen:Jetzt kannst du tun
git clone [email protected]:username/repo.git
.ANMERKUNG: Stellen Sie sicher, dass die Berechtigungen für IdentityFile 400 sind. SSH lehnt zu lesende SSH-Schlüssel in nicht eindeutiger Weise ab. Es sieht aus wie eine Ablehnung des Berechtigungsnachweises. In diesem Fall lautet die Lösung:
quelle
HostName
: Gibt den tatsächlichen Hostnamen an, bei dem die Anmeldung erfolgen soll. Dies kann verwendet werden, um Kurznamen oder Abkürzungen für Hosts anzugeben." Meine ssh-Version ist openssh-6.7p1.chmod 600 ~/.ssh/config
core.sshCommand
Git-Konfiguration verwendet. superuser.com/a/912281/162466Umgebungsvariable
GIT_SSH_COMMAND
:Ab Git Version 2.3.0 können Sie die Umgebungsvariable folgendermaßen verwenden
GIT_SSH_COMMAND
:Beachten Sie, dass
-i
dies manchmal von Ihrer Konfigurationsdatei überschrieben werden kann. In diesem Fall sollten Sie SSH eine leere Konfigurationsdatei geben, wie folgt:Konfiguration
core.sshCommand
:Ab Git Version 2.10.0 können Sie dies per Repo oder global konfigurieren, sodass Sie die Umgebungsvariable nicht mehr setzen müssen!
quelle
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example"
danngit clone example
example=hello /usr/bin/env | grep example
./dev/null
ist in UNIX-ähnlichen Betriebssystemen nur ein gültiger Dateiname. Unter Windows funktioniert dies nicht.GIT_SSH_COMMAND
hat nicht funktioniert, bis ich verwendetIdentitiesOnly
, wie dieser Befehl ein :GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push
.Es gibt keine direkte Möglichkeit ,
git
den zu verwendenden privaten Schlüssel zu bestimmen, da erssh
für die Repository-Authentifizierung erforderlich ist. Es gibt jedoch noch einige Möglichkeiten, um Ihr Ziel zu erreichen:Option 1:
ssh-agent
Mit können Sie
ssh-agent
Ihren privaten Schlüssel vorübergehend autorisieren.Zum Beispiel:
Option 2:
GIT_SSH_COMMAND
GIT_SSH_COMMAND
Übergeben Sie die ssh-Argumente mithilfe der Umgebungsvariablen (Git 2.3.0+).Zum Beispiel:
Sie können dies alles in einer Zeile eingeben - ignorieren Sie
$
und lassen Sie das\
.Option 3:
GIT_SSH
Übergeben Sie die ssh-Argumente mithilfe der
GIT_SSH
Umgebungsvariablen, um eine alternativessh
Binärdatei anzugeben .Zum Beispiel:
Hinweis: Die obigen Zeilen sind Shell (Terminal) -Befehlszeilen, die Sie in Ihr Terminal einfügen sollten. Sie erstellen eine Datei mit dem Namen
ssh
, machen sie ausführbar und führen sie (indirekt) aus.Hinweis:
GIT_SSH
ist verfügbar seit v0.99.4 (2005).Option 4:
~/.ssh/config
Verwenden Sie die
~/.ssh/config
Datei wie in anderen Antworten vorgeschlagen, um den Speicherort Ihres privaten Schlüssels anzugeben, zquelle
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
arbeitete für mich, als nichts anderes würde. Ein dickes Lob.~/.ssh/config
Methode verwenden, Env Vars funktionierte nicht für mich ...GIT_SSH
gibt es seit v0.99.4 (August 2005) , also grundsätzlich seit Git (April 2005).Schreiben Sie ein Skript, das
ssh
mit den gewünschten Argumenten aufgerufen wird, und geben Sie den Dateinamen des Skripts ein$GIT_SSH
. Oder geben Sie einfach Ihre Konfiguration ein~/.ssh/config
.quelle
~/.ssh/config
Ist der Weg zu gehen.$GIT_SSH
und ein Skript löste dieses Problem. Vielen Dank!Wenn Sie nicht jedes Mal Umgebungsvariablen angeben müssen, wenn Sie git ausführen, kein weiteres Wrapper-Skript möchten, ssh-agent (1) nicht ausführen können oder ein anderes Paket nur für diesen Zweck herunterladen möchten, verwenden Sie das git -remote-ext (1) externer Transport:
Ich halte diese Lösung für überlegen, weil:
quelle
git
Ressource zu zwingen , repository-spezifische Bereitstellungsschlüssel zu verwenden, um private Github-Repositorys zu klonen / abzurufen. Der zusätzliche Vorteil dieser Methode gegenüber der umwelt- / skriptbasierten Methode besteht darin, dass der Schlüsselpfad in der Konfiguration des Arbeitsrepos codiert ist und sowohl beim ersten Klonen als auch bei nachfolgenden Abrufen / Drücken denselben Schlüssel verwendet..ssh/config
usw. zu vermeiden . +1!ext
Transports in jedem Submodul so einstellen, dass die Rekursion im übergeordneten Modul funktioniert.fatal: transport 'ext' not allowed
, müssen Sie das ext-Protokoll über die Whitelist setzenexport GIT_ALLOW_PROTOCOL=ext
. Grundsätzlich ermöglicht der git-remote-ext-Remote-Helfer (der URLs von "ext :: ssh example.com% S foo / repo" unterstützt) die Ausführung beliebiger Befehle. Dies ist normalerweise kein Problem, da der Benutzer die an git übergebene URL immer sieht und ihr vertraut. Mit Git-Submodulen kann ein Angreifer jedoch über die Datei .gitmodules den Client auffordern, beliebige Git-URLs abzurufen. hackerone.com/reports/104465Verwenden Sie die benutzerdefinierte Hostkonfiguration
~/.ssh/config
wie folgt :Verwenden Sie dann Ihren benutzerdefinierten Hostnamen wie folgt:
quelle
Host work.github.com
HostName github.com
IdentityFile ~/.ssh/work
und dann "github.com" durch "work.github.com" ersetzen, wenn ich ein Arbeitsrepository klone. Es wird weiterhin eine Verbindung zu "github.com" hergestellt, wobei jedoch ein nicht standardmäßiges Schlüsselpaar verwendet wird.~/.ssh/config
Datei einfügen. Bei jeder anderen Antwort fehlt, wie Sie den Host festlegen können, wenn Sie den Ursprung hinzufügen, wodurch git automatisch die richtige Schlüsseldatei verwenden kann. DANKESCHÖN!!Nach meinem Kampf mit
$GIT_SSH
möchte ich mitteilen, was für mich funktioniert hat.Anhand meiner Beispiele gehe ich davon aus, dass sich Ihr privater Schlüssel unter befindet
/home/user/.ssh/jenkins
Zu vermeidender Fehler: GIT_SSH-Wert enthält Optionen
oder was auch immer ähnliches wird fehlschlagen, da git versuchen wird, den Wert als Datei auszuführen . Aus diesem Grund müssen Sie ein Skript erstellen.
Funktionsbeispiel für das Skript $ GIT_SSH
/home/user/gssh.sh
Das Skript wird wie folgt aufgerufen:
Das Beispielskript könnte folgendermaßen aussehen:
Beachten Sie das
$*
am Ende, es ist ein wichtiger Teil davon.Eine noch sicherere Alternative, die jeden möglichen Konflikt mit irgendetwas in Ihrer Standardkonfigurationsdatei verhindert (und den zu verwendenden Port explizit erwähnt), wäre:
Angenommen, das Skript ist in
/home/user/gssh.sh
, dann müssen Sie:und alles soll funktionieren.
quelle
Sie können einfach ssh-ident verwenden, anstatt einen eigenen Wrapper zu erstellen.
Weitere Informationen finden Sie unter: https://github.com/ccontavalli/ssh-ident
Bei Bedarf werden SSH-Schlüssel geladen, auch bei mehreren Anmeldesitzungen, xterms oder NFS-Shared Homes.
Mit einer winzigen Konfigurationsdatei können automatisch verschiedene Schlüssel geladen und in verschiedenen Agenten (für die Agentenweiterleitung) getrennt werden, je nachdem, was Sie tun müssen.
quelle
Ich hatte einen Kunden, der ein separates Github-Konto benötigte. Daher musste ich nur für dieses eine Projekt einen separaten Schlüssel verwenden.
Meine Lösung war, dies zu meinem .zshrc / .bashrc hinzuzufügen:
Wann immer ich git für dieses Projekt verwenden möchte, ersetze ich "infogit" durch git:
Für mich ist es einfacher, sich zu erinnern.
quelle
Also habe ich die Variable GIT_SSH env auf gesetzt
$HOME/bin/git-ssh
.Um zu unterstützen, dass meine Repo-Konfiguration festlegt, welche SSH-Identität verwendet werden soll, ist meine
~/bin/git-ssh
Datei wie folgt:Dann habe ich eine globale Git-Konfigurationseinstellung:
Und in jedem Git-Repository kann ich einfach einen lokalen
ssh.identity
Git-Konfigurationswert festlegen :Voila!
Wenn Sie für jede Identität eine andere E-Mail-Adresse haben können, wird dies noch einfacher, da Sie Ihre Schlüssel einfach nach Ihren E-Mail-Adressen benennen und die user.email der git config die Schlüsselauswahl folgendermaßen steuern
~/bin/git-ssh
lassen können:quelle
Meine Lösung war:
erstelle ein Skript:
dann, wenn Sie den var-Lauf ändern müssen:
Vergessen Sie nicht den Extrapunkt !! das Skript setzt die Umgebungen unterschiedlich !! --key und --port sind optional.
quelle
Im Allgemeinen möchten Sie
~/.ssh/config
dies verwenden. Koppeln Sie einfach die Serveradressen wie folgt mit den Schlüsseln, die Sie für sie verwenden möchten:Host *
bezeichnet einen beliebigen Server, daher verwende ich ihn~/.ssh/id_rsa
als zu verwendenden Standardschlüssel.quelle
Ich baue auf @shellholic und diesem SO-Thread mit ein paar Teaks auf. Ich verwende GitHub als Beispiel und gehe davon aus, dass Sie einen privaten Schlüssel haben
~/.ssh/github
(siehe sonst diesen SO-Thread ) und dass Sie den öffentlichen Schlüssel zu Ihrem GitHub-Profil hinzugefügt haben (siehe sonst die Hilfe von GitHub ).Erstellen Sie bei Bedarf eine neue SSH-Konfigurationsdatei unter
~/.ssh/config
und ändern Sie die Berechtigungen in 400Fügen Sie dies zur
~/.ssh/config
Datei hinzu:Wenn Sie bereits eine Remote-Einrichtung haben, möchten Sie diese möglicherweise löschen. Andernfalls werden Sie möglicherweise weiterhin zur Eingabe von Benutzername und Kennwort aufgefordert:
Fügen Sie dann dem Git-Repository ein Remote hinzu und beachten Sie den Doppelpunkt vor dem Benutzernamen:
Und dann funktionieren Git-Befehle normal, zB:
@HeyWatchThis in diesem SO-Thread schlug das Hinzufügen vor
IdentitiesOnly yes
, um das SSH-Standardverhalten beim Senden der Identitätsdatei zu verhindern, die dem Standarddateinamen für jedes Protokoll entspricht. In diesem Thread finden Sie weitere Informationen und Verweise.quelle
Verwenden Sie einfach
ssh-agent
undssh-add
Befehle.Nachdem Sie die obigen Befehle ausgeführt haben, können Sie beide Tasten gleichzeitig verwenden. Tipp einfach
um dein Repository zu klonen.
Sie müssen den obigen Befehl ausführen, nachdem Sie Ihren Computer neu gestartet haben.
quelle
Ich benutze Git Version 2.16 und ich brauche kein einziges Skript, nicht einmal eine Konfiguration oder modifizierte Befehle.
Und Git liest zu Schlüssel automatisch. Ich frage nichts und es wird kein Fehler ausgegeben. Funktioniert einfach gut.
quelle
~/.ssh
Verzeichnis handelt?Während die Frage nicht danach fragt, schließe ich diese Antwort für alle anderen ein, die das gleiche Problem speziell für gitlab lösen möchten .
Die Gitlab-Lösung
Ich habe versucht, den Umgebungsvariablen- Ansatz zu verwenden, aber selbst in der Git-Dokumentation wird die Verwendung
~/.ssh/config
für mehr als den einfachen Fall empfohlen . In meinem Fall drücke ich auf einen Gitlab- Server - und ich wollte es als bestimmter Benutzer -, der natürlich durch den privaten Schlüssel während der Authentifizierung und nicht durch den Benutzernamen definiert wirdgit
. Nach der Implementierung führe ich einfach Folgendes aus:Konfiguration
Erinnern Sie sich an den Speicherort Ihres privaten Schlüssels
/myfolder/.ssh/my_gitlab_id_rsa
in meinem Fall.Eintrag hinzufügen in
~/.ssh/config
:Fügen Sie den Git-Alias hinzu in
~/.gitconfig
:Als Bonus führe ich meine Commits auf demselben Host wie ein bestimmter Benutzer mit diesem git-Alias aus :
Erläuterung
In allen oben genannten Fällen wird davon
origin
ausgegangen, dass sich die betreffende Fernbedienung in befindet und der betreffende Zweig derzeit ausgecheckt ist. Als Referenz stieß ich auf einige Punkte, die angesprochen werden mussten:gitlab_as_me
, und es hat mir nicht gefallen, dass die zusätzliche Fernbedienung in meinem Protokollbaum herumhängt, sodass ich sie nach Abschluss entfernegitlab_as_me
Vorgang ausführen, müssen Sie genau angeben, welchen Zweig Sie pushenorigin
Bedürfnisse Zeiger „aktualisiert“ anzupassen , um zugitlab_as_me
(dasgit pull origin $branch
tut dies)quelle
Geben Sie den Pfad ein, den Sie speichern möchten (Beispiel: my-pc / Desktop / .ssh / ed25519)
Fügen Sie den öffentlichen Schlüssel zu Ihrem Gitlab hinzu ( So fügen Sie den SSH- Schlüssel zu Gitlab hinzu )
quelle
quelle