Ich habe den folgenden Anwendungsfall: Ich möchte in der Lage sein, auf die [email protected]:gitolite-admin
Verwendung des privaten Schlüssels des Benutzers gitolite-admin
zu pushen, während ich auf die [email protected]:some_repo
Verwendung von 'meinem' privaten Schlüssel pushen möchte . AFAIK, ich kann dies nicht mit lösen ~/.ssh/config
, da der Benutzername und der Servername in beiden Fällen identisch sind. Als ich vor allem meine eigenen privaten Schlüssel verwenden, habe ich das in definiert ~/.ssh/config
für [email protected]
. Kennt jemand eine Möglichkeit, den Schlüssel zu überschreiben, der für einen einzelnen git
Aufruf verwendet wird?
(Abgesehen davon: gitolite unterscheidet anhand des Schlüssels, wer das Drücken ausführt. Daher ist es in Bezug auf Zugriff, Besitz und Überwachung kein Problem, dass die Zeichenfolge user @ server für verschiedene Benutzer identisch ist.)
Antworten:
Auch wenn Benutzer und Host identisch sind, können sie dennoch unterschieden werden
~/.ssh/config
. Wenn Ihre Konfiguration beispielsweise so aussieht:Dann verwenden Sie einfach
gitolite-as-alice
undgitolite-as-bob
anstelle des Hostnamens in Ihrer URL:Hinweis
Sie möchten die Option einschließen
IdentitiesOnly yes
, um die Verwendung von Standard-IDs zu verhindern. Andernfalls werden ID-Dateien, die mit den Standardnamen übereinstimmen, zuerst ausprobiert, da dieIdentityFile
Option im Gegensatz zu anderen Konfigurationsoptionen (die sich an "first in wins" halten) an die Liste der zu versuchenden Identitäten angehängt wird . Siehe: /server/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807quelle
git@
Teil in der Fernbedienung ist nicht erforderlich, da er in derUser
Zeile der Konfiguration angegeben ist.IdentitiesOnly yes
unmittelbar nach der Zeile mitIdentityFile
für den Host enthielt . Es scheint, dass mehrere Identitäten weitergegeben wurden und eine davon für den Zugriff auf den Host gesperrt war.Ein alternativer Ansatz zu dem oben von Mark Longair angebotenen besteht darin, einen Alias zu verwenden, der jeden Git-Befehl auf jeder Fernbedienung mit einem alternativen SSH-Schlüssel ausführt. Die Idee ist im Grunde, Ihre SSH-Identität zu ändern, wenn Sie die git-Befehle ausführen.
Vorteile gegenüber dem Host-Alias-Ansatz in der anderen Antwort:
remote
explizit angeben können .Ich benutze ein paar kleine Skripte und einen Git-Alias
admin
. So kann ich zum Beispiel:So drücken Sie mit der alternativen SSH-Taste ("admin") auf die Standardfernbedienung. Auch hier können Sie
push
mit diesem Alias einen beliebigen Befehl (nicht nur ) verwenden. Sie können sogargit admin clone ...
ein Repository klonen, auf das Sie nur mit Ihrem "Admin" -Schlüssel zugreifen können.Schritt 1: Erstellen Sie die alternativen SSH-Schlüssel und legen Sie optional eine Passphrase fest, falls Sie dies auf einem anderen Computer tun.
Schritt 2: Erstellen Sie ein Skript mit dem Namen "ssh-as.sh", das Dinge ausführt, die SSH verwenden, aber einen bestimmten SSH-Schlüssel anstelle des Standardschlüssels verwenden:
Schritt 3: Erstellen Sie ein Skript mit dem Namen "git-as.sh", das git-Befehle mit dem angegebenen SSH-Schlüssel ausführt.
Schritt 4: Fügen Sie einen Alias hinzu (verwenden Sie etwas, das für "PATH_TO_SCRIPTS_DIR" unten geeignet ist):
Weitere Details unter: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/
quelle
$@
->"$@"
um sicher zu gehen.Sie können die Umgebungsvariable git verwenden
GIT_SSH_COMMAND
. Führen Sie dies in Ihrem Terminal unter Ihrem Git-Repository aus:Ersetzen Sie ihn
~/.ssh/your_private_key
durch den Pfad des privaten SSH-Schlüssels, den Sie verwenden möchten. Und Sie können den nachfolgenden Befehl git ändern (im Beispiel istgit submodule update --init
) , um wie anderegit pull
,git fetch
usw.quelle
Bei einem Unix-basierten System (Linux, BSD, Mac OS X) wird die Standardidentität im Verzeichnis $ HOME / .ssh in zwei Dateien gespeichert:
private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub
Bei Verwendungssh
ohne Option-i
, wird der private Standardschlüssel zur Authentifizierung beim Remote-System verwendet.Wenn Sie einen anderen privaten Schlüssel haben, den Sie verwenden möchten, z. B. $ HOME / .ssh / deploy_key , müssen Sie diesen verwenden
ssh -i ~/.ssh/deploy_key ...
Es ist nervig. Sie können Ihrem $ HOME / .bash_profile die folgenden Zeilen hinzufügen :
ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa
Jedes Mal, wenn Sie
ssh
odergit
oderscp
(im Grundessh
auch) verwenden, müssen Sie die Option-i
nicht mehr verwenden.Sie können der Datei $ HOME / .bash_profile beliebig viele Schlüssel hinzufügen .
quelle
Eine andere Alternative ist die Verwendung von ssh-ident, um Ihre ssh-Identitäten zu verwalten .
Es lädt und verwendet automatisch verschiedene Schlüssel basierend auf Ihrem aktuellen Arbeitsverzeichnis, den SSH-Optionen usw. Dies bedeutet, dass Sie problemlos ein Arbeits- / Verzeichnis und ein Privatverzeichnis haben können, die transparent unterschiedliche Schlüssel und Identitäten mit SSH verwenden.
quelle
Ich benutze Git Bash unter Win7. Folgendes hat bei mir funktioniert.
Erstellen Sie eine Konfigurationsdatei unter ~ / .ssh / config oder c: / users / [Ihr_Benutzername] / .ssh / config. Geben Sie in die Datei Folgendes ein:
Ich denke, der Host muss eine URL sein und nicht nur ein "Name" oder eine Referenz für Ihren Host. Zum Beispiel,
Der Pfad kann auch im Format / c / users / [Benutzername] / .... geschrieben werden
Die Lösung von Giordano Scalzo ist ebenfalls großartig. https://stackoverflow.com/a/9149518/1738546
quelle
Ab Git 2.10 ist es auch möglich, die Einstellung gitconfig sshCommand zu verwenden. Dokumentstatus :
Ein Anwendungsbeispiel wäre:
git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]
In einigen Fällen funktioniert dies nicht, da ssh_config den Befehl überschreibt. In diesem Fall versuchen Sie
ssh -i ~/.ssh/[insert_your_keyname] -F /dev/null
, ssh_config nicht zu verwenden.quelle
Ich habe den folgenden Ansatz zusammengestellt und mit Github getestet, basierend auf dem Lesen anderer Antworten, der einige Techniken kombiniert:
Der Vorteil dieses Ansatzes besteht darin, dass nach dem Einrichten keine zusätzliche Arbeit erforderlich ist, um ihn richtig zu machen. Sie müssen beispielsweise keine Remote-URLs ändern oder daran denken, die Dinge anders zu klonen. Durch das Umschreiben der URL funktioniert alles .
~/.ssh/config
~/.gitconfig
~/dev/work/.gitconfig
Solange Sie alle Ihre Arbeitsrepos unter ~ / dev / work und persönlichen Dingen an anderer Stelle aufbewahren, verwendet git beim Ziehen / Klonen / Drücken auf den Server den richtigen SSH-Schlüssel und hängt auch die richtige E-Mail-Adresse an alle an Ihre Verpflichtungen.
Verweise:
1
2
quelle
includeIf
sollte nur funktionieren, wenn ein.git
Verzeichnis vorhanden ist, dachte ich?Wenn Sie die Git-Version von ssh unter Windows verwenden, sieht die Zeile der Identitätsdatei in der ssh-Konfiguration so aus
wo
/c
ist fürc:
Um das zu überprüfen, tun Sie es in Git's Bash
quelle
Möglicherweise müssen Sie die Standard-Host-Konfiguration entfernen (oder auskommentieren)
quelle
Sie haben am meisten in der Datei Konfigurationsschlüssel ssh angegeben:
quelle
Wie bereits erwähnt,
core.sshCommand
kann config verwendet werden, um den SSH-Schlüssel und andere Parameter zu überschreiben.Hier ist ein Beispiel, in dem Sie einen alternativen Schlüssel mit dem Namen haben
~/.ssh/workrsa
und ihn für alle unter geklonten Repositorys verwenden möchten~/work
..gitconfig
Datei unter~/work
:~/.gitconfig
hinzu:quelle
Eine Möglichkeit
~/.ssh/config
besteht darin, dieMatch
Einschränkung anstelle derHost
Einschränkung zu verwenden. Ruft insbesondereMatch Exec
einen Shell-Befehl auf, um zu entscheiden, ob die Deklarationen angewendet werden sollen oder nicht. In bash können Sie den folgenden Befehl verwenden:Dies verwendet den
[
Befehl bash, um zu überprüfen, ob zwei Zeichenfolgen gleich sind. In diesem Fall wird geprüft, ob die Zeichenfolge[email protected]:gitolite-admin
mit der vom$(git config --get remote.origin.url)''
Befehl erhaltenen Ausgabe übereinstimmt .Sie können jeden anderen Befehl verwenden, der das Repository identifiziert, in dem sich die Shell befindet. Damit dies funktioniert, ist es in meinem Fall wichtig , dass die
$SHELL
Variable für Ihre Shell definiert ist/bin/bash
. Das vollständige Beispiel wäre dann das folgende~/.ssh/config
:In diesem Beispiel habe ich angenommen, dass es
~/.ssh/yourOwnPrivateKey
Ihren eigenen privaten Schlüssel~/.ssh/gitolite-admin
enthält und dass es den privaten Schlüssel des Benutzers enthältgitolite-admin
. Ich habe dieIdentitiesOnly yes
Erklärung beigefügt , um sicherzustellen, dass dem von Mark Longair erwähnten Git-Server nur ein Schlüssel angeboten wird . Die anderen Deklarationen sind nur Standard-SSH-Optionen für Git.Sie können diese Konfiguration hinzufügen, wenn Sie mehrere haben
some_repo
, die Sie mit verschiedenen Schlüsseln verwenden möchten. Wenn Sie mehrere Repositorys haben[email protected]
und die meisten von ihnen das verwenden~/.ssh/yourOwnPrivateKey
, ist es sinnvoller, diesen Schlüssel als Standard für den Host einzuschließen. In diesem Fall~/.ssh/config
wäre das:Beachten Sie, dass die Reihenfolge wichtig ist und die
Host git.company.com
Einschränkung nach derMatch Exec
einen oder den anderen erscheinen sollte.quelle
Konfigurieren Sie Ihr Repository mit
git config
. Zum Beispiel:quelle