514 Stimmen

Angabe eines SSH-Schlüssels für Git-Push für eine bestimmte Domäne

Ich habe den folgenden Anwendungsfall: Ich möchte in der Lage sein, Push zu git@git.company.com:gitolite-admin unter Verwendung des privaten Schlüssels des Benutzers gitolite-admin , während ich auf git@git.company.com:some_repo mit "meinem eigenen" privaten Schlüssel. AFAIK kann ich das Problem nicht lösen, indem ich ~/.ssh/config , da der Benutzername und der Servername in beiden Fällen identisch sind. Da ich meistens meinen eigenen privaten Schlüssel verwende, habe ich diesen in ~/.ssh/config para git@git.company.com . Kennt jemand eine Möglichkeit, den Schlüssel zu überschreiben, der für eine einzelne Taste verwendet wird? git Anrufung?

(Nebenbei bemerkt: gitolite unterscheidet anhand des Schlüssels, wer den Push ausführt, so dass es im Hinblick auf Zugriff, Besitz und Prüfung kein Problem ist, dass die Zeichenkette user@server für verschiedene Benutzer identisch ist).

827voto

Mark Longair Punkte 412179

Selbst wenn der Benutzer und der Host derselbe sind, können sie sich in ~/.ssh/config . Wenn Ihre Konfiguration zum Beispiel 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 y gitolite-as-bob anstelle des Hostnamens in Ihrer URL:

git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git

Hinweis

Sie möchten die Option IdentitiesOnly yes um die Verwendung von Standard-IDs zu verhindern. Andernfalls, wenn Sie auch id-Dateien haben, die mit den Standardnamen übereinstimmen, werden diese zuerst ausprobiert, weil im Gegensatz zu anderen Konfigurationsoptionen (die sich an "first in wins" halten) die IdentityFile Option angehängt. auf die Liste der zu versuchenden Identitäten. Siehe: https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807

134voto

Hustlion Punkte 2035

Sie können die Git-Umgebungsvariable GIT_SSH_COMMAND . 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 mit dem Pfad des privaten ssh-Schlüssels, den Sie verwenden möchten. Und Sie können den nachfolgenden Git-Befehl ändern (im Beispiel ist git submodule update --init ) zu anderen wie git pull , git fetch , usw.

60voto

sinelaw Punkte 15615

Ein alternativer Ansatz zur das oben von Mark Longair angebotene ist die Verwendung eines Alias, der Folgendes ausführt jede git-Befehl, auf jede remote, mit einem alternativen SSH-Schlüssel. Die Idee ist im Grunde, dass Sie Ihre SSH-Identität wechseln, wenn Sie die Git-Befehle ausführen.

Vorteile gegenüber dem Host-Alias-Ansatz in der anderen Antwort:

  • Arbeitet mit jede git-Befehle oder -Aliase, auch wenn Sie nicht die remote ausdrücklich.
  • Leichteres Arbeiten mit vielen Repositories, da Sie es nur einmal pro Client-Rechner einrichten müssen, nicht einmal pro Repository auf jedem Client-Rechner.

Ich verwende ein paar kleine Skripte und ein Git-Alias admin . Auf diese Weise kann ich zum Beispiel tun:

git admin push 

Um mit dem alternativen ("admin") SSH-Schlüssel einen Push auf die Standard-Fernverbindung durchzuführen. Auch hier können Sie jeden beliebigen Befehl verwenden (nicht nur push ) mit diesem Alias. Sie könnten sogar git admin clone ... um ein Repository zu klonen, auf das Sie nur mit Ihrem "admin"-Schlüssel Zugriff haben.

Schritt 1: Erstellen Sie die alternativen SSH-Schlüssel und setzen Sie optional eine Passphrase, falls Sie dies auf dem Rechner eines anderen Benutzers tun.

Schritt 2: Erstellen Sie ein Skript namens "ssh-as.sh", das Dinge ausführt, die SSH benutzen, aber einen bestimmten SSH-Schlüssel statt des Standardschlüssels verwenden:

#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"

Schritt 3: Erstellen Sie ein Skript namens "git-as.sh", das Git-Befehle unter Verwendung des angegebenen SSH-Schlüssels 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 etwas Passendes für "PATH_TO_SCRIPTS_DIR" unten):

# 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 Einzelheiten unter: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/

53voto

karlos Punkte 3600

Basierend auf der Lektüre anderer Antworten habe ich den folgenden Ansatz zusammengestellt und mit github getestet, der einige Techniken kombiniert:

  • korrekte SSH-Konfiguration
  • git-URL-Neuschreiben

Der Vorteil dieses Ansatzes ist, dass er nach der Einrichtung keine zusätzliche Arbeit erfordert - Sie müssen beispielsweise keine Remote-URLs ändern oder daran denken, Dinge anders zu klonen - das URL-Rewriting macht alles möglich.

~/.ssh/config

# Personal GitHub
Host github.com
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/github_id_rsa

# Work GitHub
Host github-work
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/work_github_id_rsa

Host *
  IdentitiesOnly yes

~/.gitconfig

[user]
    name = My Name
    email = personal@personal.email

[includeIf "gitdir:~/dev/work/"]
    path = ~/dev/work/.gitconfig

[url "github-work:work-github-org/"]
    insteadOf = git@github.com:work-github-org/

~/dev/work/.gitconfig

[user]
    email = work@work.email

Solange Sie alle Ihre Arbeits-Repos unter ~/dev/work und die persönlichen Sachen woanders aufbewahren, wird Git den richtigen SSH-Schlüssel verwenden, wenn Sie Pulls/Clones/Pushs auf den Server durchführen, und es wird auch die richtige E-Mail-Adresse an alle Ihre Commits anhängen.

Referenzen:

17voto

firfin Punkte 321

Ab Git 2.10 ist es auch möglich, die gitconfig sshCommand-Einstellung zu verwenden. Docs Zustand :

Wenn diese Variable gesetzt ist, verwenden git fetch und git push den angegebenen Befehl anstelle von ssh, wenn sie sich mit einem entfernten System verbinden müssen. Der Befehl hat die gleiche Form wie die Umgebungsvariable GIT_SSH_COMMAND und wird überschrieben, wenn die Umgebungsvariable gesetzt ist.

Ein Anwendungsbeispiel wäre: git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]

In manchen Fällen funktioniert das nicht, weil ssh_config den Befehl überschreibt. In diesem Fall versuchen Sie ssh -i ~/.ssh/[insert_your_keyname] -F /dev/null um die ssh_config nicht zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X