it-swarm.com.de

Geben Sie einen SSH-Schlüssel für git Push für eine bestimmte Domäne an

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.)

302
Confusion

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

Hinweis

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

535
Mark Longair

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:

  • Funktioniert mit any git-Befehlen oder Aliasnamen, auch wenn Sie die Variable remote nicht explizit angeben können.
  • Die Arbeit mit vielen Repositorys ist einfacher, da Sie sie nur einmal pro Client-Computer einrichten müssen, nicht einmal pro Repository auf jedem Client-Computer.

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/

54
sinelaw

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.

31
Hustlion

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.

11

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.

10
rabexc

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

8
user1738546

Möglicherweise müssen Sie die Standardkonfiguration des Hosts entfernen (oder auskommentieren)  .ssh/config

3
ViliusK

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 
3
Andrew Murphy

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.

1
firfin

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