Ich habe den folgenden Anwendungsfall: Ich möchte in der Lage sein, Push [email protected]:gitolite-admin
mit dem privaten Schlüssel des Benutzers gitolite-admin
zu verwenden, während ich Push in [email protected]:some_repo
mit 'meinem eigenen' privaten Schlüssel machen möchte. AFAIK, ich kann dieses Problem nicht mit ~/.ssh/config
lösen, da Benutzername und Servername in beiden Fällen identisch sind. Da ich meistens meinen eigenen privaten Schlüssel verwende, habe ich den in ~/.ssh/config
definierten Code für [email protected]
. Kennt jemand eine Möglichkeit, den Schlüssel zu überschreiben, der für einen einzelnen Aufruf von git
verwendet wird?
(Abgesehen davon: gitolite unterscheidet, wer den Push anhand des Schlüssels durchführt. Daher ist es hinsichtlich des Zugriffs, des Besitzes und der Überwachung kein Problem, dass die Zeichenfolge user @ server für verschiedene Benutzer identisch ist.)
Selbst wenn Benutzer und Host gleich sind, können sie in ~/.ssh/config
noch unterschieden werden. Wenn Ihre Konfiguration beispielsweise so aussieht:
Host gitolite-as-alice
HostName git.company.com
User git
IdentityFile /home/whoever/.ssh/id_rsa.alice
IdentitiesOnly yes
Host gitolite-as-bob
HostName git.company.com
User git
IdentityFile /home/whoever/.ssh/id_dsa.bob
IdentitiesOnly yes
Dann verwenden Sie einfach gitolite-as-alice
und gitolite-as-bob
anstelle des Hostnamens in Ihrer URL:
git remote add alice [email protected]:whatever.git
git remote add bob [email protected]:whatever.git
Sie möchten die Option IdentitiesOnly yes
einschließen, um die Verwendung von Standard-IDs zu verhindern. Wenn Sie auch über id-Dateien verfügen, die mit den Standardnamen übereinstimmen, werden diese zuerst ausprobiert, da im Gegensatz zu anderen Konfigurationsoptionen (die durch "first in wins" gehalten werden) die IdentityFile
-Option anhängt zur Liste der zu testenden Identitäten gehört . Siehe: https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807
Ein alternativer Ansatz für der von Mark Longair oben angeboten wird ist die Verwendung eines Alias, der den Befehl any git auf any remote mit einem alternativen SSH-Schlüssel ausführt. Die Grundidee besteht im Wesentlichen darin, 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
nicht explizit angeben können.Ich benutze ein paar kleine Skripte und einen Git-Alias admin
. So kann ich zum Beispiel:
git admin Push
So drücken Sie die Standard-Fernbedienung mit dem alternativen ("admin") SSH-Schlüssel. Sie können auch hier einen beliebigen Befehl (nicht nur Push
) mit diesem Alias verwenden. Sie können sogar git admin clone ...
tun, um ein Repository zu klonen, auf das Sie nur mit Ihrem "admin" -Schlüssel zugreifen können.
Schritt 1: Erstellen Sie die alternativen SSH-Schlüssel. Legen Sie optional eine Passphrase fest, falls Sie dies auf dem Computer eines anderen Benutzers tun.
Schritt 2: Erstellen Sie ein Skript mit dem Namen "ssh-as.sh", das Elemente ausführt, die SSH verwenden, jedoch einen bestimmten SSH-Schlüssel anstelle des Standardwerts verwenden:
#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "[email protected]"
Schritt 3: Erstellen Sie ein Skript namens "git-as.sh", das git-Befehle mit dem angegebenen SSH-Schlüssel ausführt.
#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"
Schritt 4: Fügen Sie einen Alias hinzu (verwenden Sie einen für "PATH_TO_SCRIPTS_DIR" geeigneten Pfad):
# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"
Weitere Informationen unter: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/
Sie können die git-Umgebungsvariable GIT_SSH_COMMAND
verwenden. Führen Sie dies in Ihrem Terminal unter Ihrem Git-Repository aus:
GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init
Ersetzen Sie ~/.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 (im Beispiel git submodule update --init
) in andere wie git pull
, git fetch
usw. ändern.
Bei Unix-basierten Systemen (Linux, BSD, Mac OS X) wird die Standardidentität im Verzeichnis $ HOME/.ssh in 2 Dateien gespeichert:
private key: $HOME/.ssh/id_rsa
public key: $HOME/.ssh/id_rsa.pub
Wenn Sie ssh
ohne die Option -i
verwenden verwendet den standardmäßigen privaten Schlüssel zur Authentifizierung beim fernen System.
Wenn Sie einen anderen privaten Schlüssel verwenden möchten, zum Beispiel$ HOME/.ssh/deploy_key, müssen Sie ssh -i ~/.ssh/deploy_key ...
verwenden.
Es ist nervig. Sie können die folgenden Zeilen in Ihr$ HOME/.bash_profile:
ssh-add ~/.ssh/deploy_key
ssh-add ~/.ssh/id_rsa
einfügen.
Jedes Mal, wenn Sie ssh
oder git
oder scp
(grundsätzlich auch ssh
) verwenden, müssen Sie die Option -i
nicht mehr verwenden.
Sie können beliebig viele Schlüssel in der Datei$ HOME/.bash_profilehinzufügen.
Eine andere Alternative ist die Verwendung von ssh-ident, um Ihre ssh-Identitäten zu verwalten .
Es werden automatisch verschiedene Schlüssel geladen und verwendet, die auf Ihrem aktuellen Arbeitsverzeichnis, den ssh-Optionen usw. basieren. Dies bedeutet, dass Sie problemlos über ein Arbeitsverzeichnis und ein privates Verzeichnis verfügen können, die mit ssh unterschiedliche Schlüssel und Identitäten verwenden.
Ich verwende Git Bash unter Win7. Folgendes hat für mich gearbeitet.
Erstellen Sie eine Konfigurationsdatei unter ~/.ssh/config oder c:/users/[Ihr_Benutzername] /. Ssh/config. In der Datei geben Sie ein:
Host your_Host.com
IdentityFile [absolute_path_to_your_.ssh]\id_rsa
Ich denke, der Host muss eine URL sein und nicht nur ein "Name" oder ein Ref für Ihren Host. Zum Beispiel,
Host github.com
IdentityFile c:/users/[user_name]/.ssh/id_rsa
Der Pfad kann auch im Format/c/users/[Benutzername]/.... geschrieben werden
Die von Giordano Scalzo bereitgestellte Lösung ist auch großartig . https://stackoverflow.com/a/9149518/1738546
Wenn Sie die Git-Version von ssh unter Windows verwenden, sieht die Identitätsdateizeile in der ssh-Konfiguration folgendermaßen aus
IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice
wo /c
für c:
ist
Um zu überprüfen, in gits bash tun
cd ~/.ssh
pwd
Ab git 2.10 kann auch die Einstellung gitconfig sshCommand verwendet werden. Dokumentstatus :
Wenn diese Variable gesetzt ist, verwenden git fetch und git Push den angegebenen Befehl anstelle von ssh, wenn eine Verbindung zu einem Remote-System hergestellt werden muss. Der Befehl hat dieselbe Form wie die Umgebungsvariable GIT_SSH_COMMAND und wird überschrieben, wenn die Umgebungsvariable festgelegt wird.
Ein Verwendungsbeispiel 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.
sie haben am meisten in der Datei Konfigurationsschlüssel ssh angegeben:
# Default GitHub user
Host one
HostName gitlab.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/key-one
IdentitiesOnly yes
#two user
Host two
HostName gitlab.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/key-two
IdentitiesOnly yes