Wie kann ich git mitteilen, welchen privaten Schlüssel ich verwenden soll?

ssh hat die Option -i, um anzugeben, welche private Schlüsseldatei bei der 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 wird gelesen.  Der Standardwert ist ~/.ssh/identity für Protokollversion 1, und ~/.ssh/id_rsa und ~/.ssh/id_dsa für Protokollversion 2.  Identitätsdateien können auch pro Host angegeben werden in der Konfigurationsdatei.  Es ist möglich, mehrere zu haben -i optionen (und mehrere Identitäten in Konfigurationsdateien angegeben).

Gibt es eine ähnliche Möglichkeit, git mitzuteilen, welche private Schlüsseldatei auf einem System mit mehreren privaten Schlüsseln im Verzeichnis ~/.ssh verwendet werden soll?

20 answers

In ~/.ssh/config, hinzufügen:

Host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github

Wenn die Konfigurationsdatei neu ist, müssen Sie möglicherweise chmod 600 ~/.ssh/config

Jetzt können Sie git clone [email protected]:{ORG_NAME}/{REPO_NAME}.git

  • Wobei {ORG_NAME} der GitHub-URI-Name Ihres GitHub-Benutzerkontos (oder Organisationskontos) ist.
    • Beachten Sie, dass es einen Doppelpunkt : nach github.com anstelle des Schrägstrichs / gibt - da dies kein URI ist.
  • Und {REPO_NAME} ist der URI-Name Ihres GitHub-Repos
  • Zum Beispiel für den Linux-Kernel wäre dies git clone [email protected]:torvalds/linux.git).

HINWEIS: Stellen Sie unter Linux und macOS sicher, dass die Berechtigungen für Ihre IdentityFile 400 sind. SSH lehnt nicht eindeutig explizit SSH-Schlüssel ab, die zu lesbar sind. Es wird nur wie eine Ablehnung von Anmeldeinformationen aussehen. Die Lösung ist in diesem Fall:

chmod 400 ~/.ssh/id_rsa_github
 806
Author: shellholic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-11-25 07:45:56

Umgebungsvariable GIT_SSH_COMMAND:

Ab Git Version 2.3.0 können Sie die Umgebungsvariable GIT_SSH_COMMAND wie folgt verwenden:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

Beachten Sie, dass -i manchmal von Ihrer Konfigurationsdatei überschrieben werden kann, in diesem Fall sollten Sie SSH eine leere Konfigurationsdatei wie folgt geben:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Konfiguration core.sshCommand:

Ab Git Version 2.10.0 können Sie dies pro Repo oder global konfigurieren, sodass Sie die Umgebungsvariable nicht mehr festlegen müssen!

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
 480
Author: Flimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-10-28 11:30:15

Es gibt Nein direkt Weg sagen git die privaten Schlüssel zu benutzen, weil Sie sich auf ssh für das repository-Authentifizierung. Es gibt jedoch noch einige Möglichkeiten, Ihr Ziel zu erreichen:

Option 1: ssh-agent

Sie können ssh-agent verwenden, um Ihren privaten Schlüssel vorübergehend zu autorisieren.

Zum Beispiel:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

Option 2: GIT_SSH_COMMAND

Übergeben Sie die ssh-Argumente mithilfe der Umgebungsvariablen GIT_SSH_COMMAND (Git 2.3.0+).

Für Beispiel:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

Sie können dies alles in einer Zeile eingeben-ignore $ und lassen Sie die \.

Option 3: GIT_SSH

Übergeben Sie die ssh-Argumente mithilfe der Umgebungsvariablen GIT_SSH, um die alternative ssh - Binärdatei anzugeben.

Zum Beispiel:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

Hinweis: Die obigen Zeilen sind Shell-Befehlszeilen (Terminal), die Sie in Ihr Terminal einfügen sollten. Sie erstellen eine Datei mit dem Namen ssh, machen Sie es ausführbar und (indirekt) führe es aus.

Hinweis: GIT_SSH ist seit v0 verfügbar.99.4 (2005).

Option 4: ~/.ssh/config

Verwenden Sie die Datei ~/.ssh/config wie in anderen Antworten vorgeschlagen, um den Speicherort Ihres privaten Schlüssels anzugeben, z. B.

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
 144
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-11-17 14:13:27

Verwenden Sie die benutzerdefinierte Hostkonfiguration in ~/.ssh/config wie folgt:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

Verwenden Sie dann Ihren benutzerdefinierten Hostnamen wie folgt:

git remote add thuc git@gitlab-as-thuc:your-repo.git  
 38
Author: thucnguyen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-04-18 04:53:59

Schreiben Sie ein Skript, das ssh mit den gewünschten Argumenten aufruft, und geben Sie den Dateinamen des Skripts in $GIT_SSH ein. Oder legen Sie einfach Ihre Konfiguration in ~/.ssh/config.

 33
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-01-12 18:25:51

Wenn Sie bei jeder Ausführung von git keine Umgebungsvariablen angeben müssen, kein anderes Wrapper-Skript möchten, ssh-agent(1) nicht ausführen können oder ein anderes Paket nur dafür herunterladen möchten, verwenden Sie den externen Transport von git-remote-ext(1):

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

Ich halte diese Lösung für überlegen, weil:

  • Es ist Repository / Remote-spezifisch
  • Vermeiden Sie Wrapper script bloat
  • Brauchen Sie den SSH-Agenten nicht-nützlich, wenn Sie unbeaufsichtigte Klone/Push/Pulls (z. in der cron)
  • Definitiv kein externes tool nötig
 24
Author: flaviovs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-07-21 19:44:50

Nach meinem Kampf mit $GIT_SSH möchte ich teilen, was für mich funktioniert hat.

In meinen Beispielen gehe ich davon aus, dass Sie Ihren privaten Schlüssel bei/home/user/.ssh/jenkins

Fehler zu vermeiden: GIT_SSH Wert enthält Optionen

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

Oder ähnliches schlägt fehl, da git versucht, den Wert als Datei auszuführen. Aus diesem Grund müssen Sie ein Skript erstellen.

Arbeitsbeispiel für $GIT_SSH Script /home/user/gssh.sh

Das Skript wird aufgerufen als folgt:

$ $GIT_SSH [username@]host [-p <port>] <command>

Beispielskript arbeiten könnte aussehen wie:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

Beachten Sie die $* am Ende ist es ein wichtiger Teil davon.

Eine noch sicherere Alternative, die einen möglichen Konflikt mit irgendetwas in Ihrer Standardkonfigurationsdatei verhindern würde (plus explizite Erwähnung des zu verwendenden Ports) wäre:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

Unter der Annahme, dass das Skript in /home/user/gssh.sh ist, werden Sie dann:

$ export GIT_SSH=/home/user/gssh.sh

Und alles wird funktionieren.

 17
Author: Jan Vlcinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-05-28 17:09:40

Ich hatte einen Client, der ein separates Github-Konto benötigte. Also musste ich nur für dieses eine Projekt einen separaten Schlüssel verwenden.

Meine Lösung war, dies zu meinem hinzuzufügen .der zshrc / .bashrc:

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"

Wenn ich git für dieses Projekt verwenden möchte, ersetze ich "infogit" durch git:

infogit commit -am "Some message" && infogit push

Für mich ist es leichter sich zu erinnern.

 7
Author: Michael Cole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-03-26 19:26:38

Also setze ich die env-Variable GIT_SSH auf $HOME/bin/git-ssh.

Um zu unterstützen, dass meine Repo-Konfiguration vorschreibt, welche SSH-Identität verwendet werden soll, lautet meine ~/bin/git-ssh Datei:

#!/bin/sh
ssh -i $(git config --get ssh.identity) -F /dev/null -p 22 $*

Dann habe ich eine globale Git-Konfigurationseinstellung:

$ git config --global ssh.identity ~/.ssh/default_id_rsa

Und in jedem Git-Repository kann ich einfach einen lokalen Git-Konfigurationswert ssh.identity festlegen:

$ git config --local ssh.identity ~/.ssh/any_other_id_rsa

Voila!

Wenn Sie für jede Identität eine andere E-Mail-Adresse haben können, wird es noch einfacher, da Sie Ihre Schlüssel einfach nach Ihrer E-Mail benennen können adressen und habe dann den Benutzer der git config.e-Mail-Laufwerk die Schlüsselauswahl in einem ~/bin/git-ssh wie folgt:

#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*
 7
Author: Brendan Baldwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-12-05 23:27:30

Sie können einfach ssh-ident verwenden, anstatt einen eigenen Wrapper zu erstellen.

Lesen Sie mehr unter: https://github.com/ccontavalli/ssh-ident

Es lädt SSH-Schlüssel bei Bedarf, wenn sie zum ersten Mal benötigt werden, einmal, 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 Agentweiterleitung) getrennt werden, je nachdem, was Sie tun müssen.

 6
Author: rabexc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-07-15 18:44:22

Wenn Sie mit verschiedenen Schlüsseln eine Verbindung zum selben Host herstellen müssen, können Sie dies erreichen durch:

  1. Konfigurieren Sie die ~/.ssh/config mit verschiedenen Hosts, aber gleichen HostNamen.
  2. Klonen Sie Ihr Repo mit dem entsprechenden Host.

Beispiel:

~/.ssh/config

Host work
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_rsa_work
 User git

Host personal
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_rsa_personal
 User git

Dann statt Klonen Sie Ihre Repos wie:

git clone [email protected]:username/my-work-project.git
git clone [email protected]:username/my-personal-project.git

Sie müssen tun

git clone git@work:username/my-work-project.git
git clone git@personal:username/my-personal-project.git
 5
Author: Maistora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-24 00:58:26

Meine Lösung war folgende:

Erstelle ein Skript:

#!/bin/bash
KEY=dafault_key_to_be_used
PORT=10022 #default port...
for i in $@;do
   case $i in
    --port=*)
        PORT="${i:7}";;
    --key=*)KEY="${i:6}";;
   esac
done
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/${KEY} -p ${PORT}"
echo Command: $GIT_SSH_COMMAND

Wenn Sie dann den var-Lauf ändern müssen:

. ./thescript.sh [--port=] [--key=]

Vergiss den zusätzlichen Punkt nicht!! dadurch setzt das Skript die Umgebungsvariablen!! --Taste und-port sind optional.

 3
Author: Salsicha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-12-05 12:22:32

Im Allgemeinen möchten Sie dafür ~/.ssh/config verwenden. Koppeln Sie Serveradressen einfach wie folgt mit den Schlüsseln, die Sie für sie verwenden möchten:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host * bezeichnet einen beliebigen Server, daher verwende ich ihn, um ~/.ssh/id_rsa als Standardschlüssel festzulegen.

 3
Author: Zaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-02-11 22:44:57

Ich baue auf @shell und diesen SO-Thread mit ein paar Teaks auf. Ich verwende GitHub als Beispiel und gehe davon aus, dass Sie einen privaten Schlüssel in ~/.ssh/github haben (andernfalls siehe this SO thread) und dass Sie den öffentlichen Schlüssel zu Ihrem GitHub-Profil hinzugefügt haben (andernfalls siehe GitHub ' s help).

Erstellen Sie bei Bedarf eine neue SSH-Konfigurationsdatei unter ~/.ssh/config und ändern Sie die Berechtigungen in 400

touch ~/.ssh/config
chmod 600 ~/.ssh/config

Fügen Sie dies der Datei ~/.ssh/config hinzu:

Host github.com
    IdentityFile ~/.ssh/github
    IdentitiesOnly yes

Wenn Sie bereits eine Fernbedienung eingerichtet haben, können Sie möglicherweise möchten Sie es löschen, andernfalls werden Sie möglicherweise weiterhin nach Benutzername und Kennwort gefragt:

git remote rm origin

Fügen Sie dann dem Git-Repository eine Fernbedienung hinzu und beachten Sie den Doppelpunkt vor dem Benutzernamen:

git remote add origin [email protected]:user_name/repo_name.git

Und dann funktionieren Git-Befehle normal, zB:

git push origin master
git pull origin 

@HeyWatchThis on Dieser SO-Thread schlug vor, IdentitiesOnly yes hinzuzufügen, um zu verhindern, dass das SSH-Standardverhalten beim Senden der Identitätsdatei mit dem Standarddateinamen für jedes Protokoll übereinstimmt. Siehe diesen Thread für weitere Informationen und Verweis.

 3
Author: miguelmorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-05-03 10:17:14

Verwenden Sie einfach die Befehle ssh-agent und ssh-add.

# create an agent
ssh-agent

# add your default key
ssh-add ~/.ssh/id_rsa

# add your second key
ssh-add ~/.ssh/<your key name>

Nachdem Sie die obigen Befehle ausgeführt haben, können Sie beide Tasten gleichzeitig verwenden. Geben Sie einfach

git clone [email protected]:<yourname>/<your-repo>.git

Um Ihr Repository zu klonen.

Sie müssen den obigen Befehl ausführen, nachdem Sie Ihren Computer neu gestartet haben.

 1
Author: Jinmiao Luo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-03-17 22:52:59
    # start :: how-to use different ssh identity files

    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "[email protected]"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "[email protected]"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone [email protected]:corp/project.git

    export git_msg="my commit msg with my corporate identity, explicitly provide author"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <[email protected]>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone [email protected]:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity, again author "
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <[email protected]>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push ; 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # stop :: how-to use different ssh identity files
 1
Author: Yordan Georgiev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-08-31 05:43:47

Alle bisherigen Informationen (2020-01) sind nützlich, aber IMHO sind ein wenig chaotisch, und kein Beitrag fasst sie zu einer sauberen Lösung zusammen.

Also hier sind meine Lösungen. Wenn Sie mit Ihrer aktuellen Lösung Glück haben, können Sie diesen Beitrag ignorieren.

Insgesamt Prämisse:
Lösung für *nix-basiertes Betriebssystem. Getestet auf Debian-basiertem Betriebssystem, sollte aber auf anderen *nix-basierten Betriebssystemen funktionieren.

Allgemeine Voraussetzungen:

  • Separaten Identität-Dateien (schlüssel) für verschiedene Hosts und / oder Benutzer verfügbar, z.B. generiert über ssh-keygen -f <filename> ...

Tore: 1: 0, 2: 0, 3: 0, 4: 0]}

  • Verwenden Sie eine bestimmte Identitätsdatei (Schlüssel) pro Repository (optional: pro Host)
  • Funktioniert mit jedem host: GitHub, GitLab, BitBucket, etc.
  • Einfach zu bedienen und zu adoptieren
  • Ziehe es vor, nicht mit URLs herumzuspielen und sie so zu verwenden, wie sie sind
  • Verwenden Sie lieber die normale Konfiguration von git und ssh
  • (nice-to-have) Arbeiten in der shell und gui werkzeuge
  • (nett zu haben) Funktioniert mit jedem tool: git, ssh, svn, rsync, etc.

Lösungen:

  1. praktisches Werkzeug ssh-ident
  2. Nur normale git und ssh, mit einer kleinen Portition Shell magic
  3. Host Umbenennen (funktioniert auch mit Putty / Pageant/Plink)

Hinweis: Eine Match Path - Funktion für OpenSSH würde hier nicht helfen, siehe https://marc.info/?l=openssh-unix-dev&m=141833748901966&w=2

Lösung #1 - Tool ssh-ident
Noten:

  • Derzeit (ab 2020-01) verlinke ich meine eigene Fork des ursprünglichen ssh-ident, da dies dem Argument und der Schlüsseldateinamen-Übereinstimmung mehr Flexibilität gibt.
  • Siehe docstring in ssh-ident für wie verwenden Sie

Voraussetzungen:

  • keine

Herunterladen und vorbereiten

  • Laden Sie zuerst in ein Projektverzeichnis herunter und installieren Sie es dann in /usr / local / bin
    DLDIR="${HOME}/work/packages/ssh-ident"
    [ -d "${DLDIR}" ] || mkdir -vp "${DLDIR}"
    #
    #original: DLURL='https://raw.githubusercontent.com/ccontavalli/ssh-ident/master'
    DLURL='https://raw.githubusercontent.com/maddes-b/ssh-ident/master/ssh-ident'
    wget -P "${DLDIR}" -N "${DLURL}/ssh-ident"
    unset -v DLURL
    #
    install -v -D -t /usr/local/bin "${DLDIR}/ssh-ident"
    ## Debian base >=11 "bullseye": sed -i -e '1 s#\(\spython\)\(\s\|$\)#\13\2#' /usr/local/bin/ssh-ident
    #
    unset -v DLDIR
    

Konfigurieren Sie ssh-ident und die Identitäten

  • Dateien und Verzeichnisse vorbereiten
    [ -f ~/.ssh-ident ] || printf -- '\n' >~/.ssh-ident
    MYEXTRAIDENTITIES='1 gh2 dummy'
    for MYIDENTITY in ${MYEXTRAIDENTITIES}; do
      echo "${MYIDENTITY}"
      [ -d ~/.ssh/identities/"${MYIDENTITY}" ] || mkdir -vp ~/.ssh/identities/"${MYIDENTITY}"
    done
    chmod -v -R u=rwX,go= ~/.ssh/identities
    unset -v MYEXTRAIDENTITIES MYIDENTITY
    
  • Konfiguration von ssh-ident beibehalten, um GitHub-Repositorys zu erkennen
    Beispiel: ~/.ssh-ident
    ...
    MATCH_ARGV = [
      (r"\s(git@)?github\.com\s.*'my-git-user-1\/dummy\.git'", "dummy"),
      (r"\s(git@)?github\.com\s.*'my-git-user-1\/.+\.git'", "1"),
      (r"\s(git@)?github\.com\s.*'my-git-user-2\/.+\.git'", "gh2"),
      ...
      #
      (r"\s(git@)?gist\.github\.com\s.*'abcdef01234567890fedcba912345678\.git'", "1"),
      ...
    ]
    ...
    
  • Private Schlüssel kopieren plus Ihre öffentlichen Schlüssel(!) in das entsprechende Identitätsverzeichnis
  • Erstellen Sie optional eine SSH-Konfigurationsdatei pro Identität
    Beispiel: ~/.ssh/Identitäten/1/config
    Host github.com,gist.github.com
        IdentitiesOnly yes
        IdentityFile ~/.ssh/identities/1/config/github-user1.key
        User git
    

ssh-ident aktivieren

  • Setup als ssh Wrapper durch Installation als ssh über symbolischen Link zu ssh-ident, entweder in /usr / local / bin für alle Benutzer oder in einem Benutzer bin Verzeichnis
    ln -s -T /usr/local/bin/ssh-ident ~/bin/ssh
    
  • Testen der ssh-ident-Konfiguration. Übergeben Sie die Parameter an den SSH-Aufruf.
    ssh -vT [email protected] "test 'my-git-user-1/test-repo.git'"
    
  • git Verwenden als normal.

Lösung #2 - Nur normales Git und ssh
Voraussetzungen:

  • git version 2.10+
    • git config core.sshCommand (2.10+)
  • OpenSSH-client version 6.5+
    • Funktion Match (6.5+)
    • option IdentityFile none (6.3+)
    • option IdentitiesOnly (3.9+)

Konzept:
Verwenden Sie die Match Exec - Funktionalität von OpenSSH client config, um zu überprüfen für eine Umgebungsvariable (z. B. SSHGITUSER), um eine bestimmte Identitätsdatei (Schlüssel) auszuwählen. Schlägt fehl, wenn die Umgebungsvariable nicht festgelegt ist oder eine unbekannte Benutzer-ID enthält.

Ermöglicht die folgenden Optionen:

  • Ein Konto auf dem Host: Verwenden Sie den Block Host in der OpenSSH-Clientkonfiguration, um den Standard IdentityFile = pure vanilla ssh direkt zu definieren, keine Umgebungsvariable erforderlich
  • Mehrere Konten auf einem Host: Übergeben Sie die Umgebungsvariable an den OpenSSH-Client, damit er innerhalb von Sekunden darauf reagieren kann Match Blöcke
    • Setzen Sie entweder die Umgebungsvariable direkt vor dem Git-Aufruf (z. B. SSHGITUSER='<id>' git ...)
      • Muss beim Klonen eines Git-Repositorys verwendet werden (z. B. SSHGITUSER='<id>' git clone ...)
      • Funktioniert auch für Fernbedienungen, die unterschiedliche Identitätsdateien benötigen (z. B. SSHGITUSER='<id>' git fetch <remote>)
      • Funktioniert auch bei Verwendung von Umgebungsvariablen GIT_SSH_COMMAND oder GIT_SSH (siehe docs)
    • oder verwenden Sie git config core.sshCommand, um es für ein Repository fest zu codieren (z. B. git config --local core.sshCommand "SSHGITUSER='<id>' ssh")
      • Ist nicht arbeit für fernbedienungen, die müssen verschiedene identität dateien
      • Funktioniert nicht, wenn Umgebungsvariablen GIT_SSH_COMMAND oder GIT_SSH verwendet werden (siehe docs), da diese git config core.sshCommand des Repositorys überschreiben

Einrichten von OpenSSH client config ssh_config:
Immer wenn wir eine Verbindung über ssh zu einem Host herstellen, möchten wir uns nur mit den explizit angegebenen Identitätsdateien verbinden. Dies kann erreicht werden, durch Setzen von IdentitiesOnly auf yes und IdentityFile auf none in einem übereinstimmenden Host Block werden dem Zielserver keine anderen Identitätsdateien angeboten, selbst wenn sie im ssh-Agent zwischengespeichert werden, noch die Standardschlüsseldefinitionen werden versucht.
Wenn ein Standardblock Host für alle Server vorhanden ist, erweitern Sie sein Muster, um den speziellen Host dort auszuschließen.
Wählen Sie die gewünschte Identitätsdatei aus, indem Sie eine Umgebungsvariable überprüfen (z. B. SSHGITUSER). Definieren Sie eine ID (Nummer, Buchstabe oder Name) für jeden Benutzer und erstellen Sie ein Match block für jede id. Der Block Match sollte zuerst Host überprüfen, um zu vermeiden, dass die Identitätsdatei für andere Hosts verwendet wird, und um nutzlose Aufrufe der Shell zum Testen der Umgebungsvariablen zu vermeiden.
Wenn Sie den Benutzer git für github.com und gist.github.com angeben, können Sie git@ aus der URL entfernen. Diese Einstellung wird überschrieben, wenn ein Benutzer in der URL definiert ist.

Beispiel ~/.ssh / config für GitHub:

...
### >>> GitHub
## use: SSHGITUSER='<id>' git ...
## optional: git config --local core.sshCommand "SSHGITUSER='<id>' ssh"
Host github.com,gist.github.com
    IdentitiesOnly yes
    IdentityFile none
    User git

Match Host github.com,gist.github.com Exec "test ${SSHGITUSER:-_} = '1'"
    IdentityFile ~/.ssh/github-user1.key

Match Host github.com,gist.github.com Exec "test ${SSHGITUSER:-_} = 'gh2'"
    IdentityFile ~/.ssh/github-user2.key

Match Host github.com,gist.github.com Exec "test ${SSHGITUSER:-_} = 'dummy'"
    IdentityFile ~/.ssh/github-dummy-fake.key
### <<< GitHub
...
Host !github.com,!gist.github.com,*
    IdentityFile ~/.ssh/personal.key
...

Anmerkungen:

  • Wenn nur eine einzelne Identitätsdatei für einen Host verwendet wird, dann in der Verwandte Host block change) IdentityFile von none direkt zu der Identität-Datei und keinerlei Match Blöcke benötigt werden.
  • Remote User kann auch in einem Match Block gesetzt werden. Denken Sie daran, dass ein Benutzer in der URL diese Einstellung überschreibt.

Testen der SSH-Konfiguration:
Übergeben Sie die Umgebungsvariable für den SSH-Aufruf, indem Sie sie direkt vor dem Befehl definieren. Verwenden Sie einen falschen Benutzer in der URL, um tatsächliche Anmeldungen zu vermeiden, da nur die Identitätsdateien angezeigt werden sollen, die dem Server.

SSHGITUSER='1' ssh -vT [email protected]

Einrichten der Git-Konfiguration eines Repositorys für eine fest codierte Benutzer-ID:
Um die Benutzer-ID fest in ein Repository zu codieren, verwenden Sie git config core.sshCommand auf dem Repository selbst (über --local), um die Umgebungsvariable an den Befehl ssh zu übergeben.
Der ssh-Befehl für git wird entweder durch die Umgebungsvariable GIT_SSH_COMMAND (seit git 2.3) oder git config core.sshCommand (seit git 2.10) definiert. Wenn beide leer sind, dann ist es normalerweise nur ssh (siehe Code funtions get_ssh_command () und fill_ssh_args () in verbinden.c).
Wenn Sie ein Repository klonen, gibt es keine Konfiguration für das noch nicht geklonte Repository, und die Umgebungsvariable muss direkt vor dem Git-Aufruf festgelegt werden (z. B. SSHGITUSER='<id>' git clone ...).

Beispiel:

SSHGITUSER='1' git clone [email protected]:my-git-user-1/test-repo.git ~/work/test-repo
cd ~/work/test-repo
git config --local core.sshCommand "SSHGITUSER='1' ssh"
# Test: git fetch

Anmerkungen:
Bei Verwendung der Umgebungsvariablen GIT_SSH_COMMAND oder GIT_SSH (siehe docs) überschreiben diese die git config core.sshCommand des Repositorys.
Überprüfen Sie zuerst über set | grep -e '^GIT_SSH' und falls vorhanden wird gesetzt, dann von der Verwendung von Umgebungsvariablen an git config core.sshCommand des Benutzers anpassen (über --global) und die Variable GIT_SSH[_COMMAND] entfernen.
(z.B. git config --global core.sshCommand "<content of used GIT_SSH[_COMMAND] variable>" plus git config --local core.sshCommand "SSHGITUSER='<id>' <content of used GIT_SSH[_COMMAND] variable>")

Andere Ideen für #2:

  • Verwenden Sie die Umgebungsvariable für IdentityFile ~/.ssh/github-${SSHGITUSER}.key oder User ${SSHGITUSER}. Hat die Tendenz zu längeren Benutzer-IDs.

Einrichten anderer Tools für #2:
Übergeben Sie in der Befehlszeile einfach die Umgebungsvariable, indem Sie sie direkt vor der Befehl.
Zum Hardcodieren der Benutzer-ID besteht die Aufgabe darin, herauszufinden, wie die Umgebungsvariable an das Tool übergeben wird, z. B. Konfiguration, Wrapper-Skript, Alias usw.

Lösung # 99-Umbenennung des Hosts
Voraussetzungen:

  • keine

Konzept:
Wie auch in diesem Thread erwähnt, können Sie den Host wie in der git FAQ für die ssh-Konfiguration umbenennen, um ihn zu erkennen, die Identität abhängig davon auswählen und legen Sie den richtigen Hostnamen fest.
Normalerweise bevorzuge ich es nicht, URLs durcheinander zu bringen, anstatt Konfigurationen/Variablen zu verwenden. Trotzdem würde ich dann die Benutzer-ID als Subdomain hinzufügen, zB <user id>.github.com.
Nach einigen Gesprächen hat das Hinzufügen der Benutzer-ID hinter dem Host den Vorteil, dass die DNS-Auflösung normalerweise fehlschlägt, da die TLD durcheinander geraten ist und daher auch die Verbindung sofort fehlschlägt. Das Beispiel dafür wurde erweitert, z. B. github.com-<user id>.

Dies funktioniert auch für Plink und Pageant von Kitt. Putty sucht nach einer gespeicherten Sitzung mit dem Namen "host", z. B. session github.com-<user id>. Dies kann für diese Lösung verwendet werden.
Dann prüft Putty nach einer Sitzung, die auf den Host verweist, z. B. session testing mit host github.com. Nur um dich wissen zu lassen.

Beispiel ~/.ssh / config für GitHub:

...
### >>> GitHub
Host github.com,gist.github.com,*.github.com,*.gist.github.com,github.com-*,gist.github.com-*
        IdentitiesOnly yes
        IdentityFile none
        User git

Host 1.github.com,github.com-1
        IdentityFile ~/.ssh/github-user1.key
        Hostname github.com

Host 1.gist.github.com,gist.github.com-1
        IdentityFile ~/.ssh/github-user1.key
        Hostname gist.github.com

Host gh2.github.com,github.com-gh2
        IdentityFile ~/.ssh/github-user2.key
        Hostname github.com

Host gh2.gist.github.com,gist.github.com-gh2
        IdentityFile ~/.ssh/github-user2.key
        Hostname gist.github.com

### <<< GitHub

Host !github.com,!gist.github.com,*
   IdentityFile ~/.ssh/personal.key
...

 1
Author: Maddes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2021-01-23 20:57:18

Ich verwende git Version 2.16 und brauche kein einziges Skript, nicht einmal eine Konfiguration oder geänderte Befehle.

  • Habe gerade meinen privaten Schlüssel kopiert .ssh/id_rsa
  • Berechtigungen auf 600 setzen

Und git liest automatisch in die Taste. Ich frage nichts und es wird kein Fehler ausgegeben. Funktioniert einfach gut.

 0
Author: akjprajapati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-06-06 04:37:12

Während die Frage es nicht anfordert, füge ich diese Antwort für alle anderen hinzu, die das gleiche Problem nur speziell für gitlab lösen möchten.

Die gitlab Lösung

Ich habe versucht, die Umgebungsvariablen zu verwenden, aber selbst in der Git-Dokumentation wird empfohlen, ~/.ssh/config für mehr als den einfachen Fall zu verwenden. In meinem Fall drücke ich auf einen gitlab Server - und ich wollte dies als bestimmter Benutzer tun - was natürlich der Fall ist definiert durch den privaten Schlüssel während der Authentifizierung und nicht durch den Benutzernamen git. Einmal implementiert führe ich einfach Folgendes aus:

~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]

Einrichtung

Rufen Sie den Speicherort Ihres [[28]}privaten Schlüssels auf /myfolder/.ssh/my_gitlab_id_rsa in meinem Fall.

Fügen Sie einen Eintrag in ~/.ssh/config hinzu:

Host gitlab-delegate
    HostName gitlab.mydomain.com
    User git
    IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
    IdentitiesOnly yes

Fügen Sie die git-Alias in ~/.gitconfig:

mypush = "!f() { \
           path=$(git config --get remote.origin.url | cut -d':' -f2); \
           branch=$(git rev-parse --abbrev-ref HEAD); \
           git remote add gitlab_as_me git@gitlab-delegate:$path && \
           git push gitlab_as_me $branch && \
           git pull origin $branch; \
           git remote remove gitlab_as_me; \
         }; f"

Als Bonus führe ich meine Commits auf demselben Host wie ein bestimmter Benutzer aus damit git-alias:

mycommit = "!f() { \
             git -c "user.name=myname" -c "[email protected]" commit \"$@\"; \
           }; f"

Erklärung

All dies setzt voraus, dass die relevante Remote origin ist und der relevante Zweig derzeit ausgecheckt ist. Als Referenz stieß ich auf mehrere Elemente, die angesprochen werden mussten:

  • Die Lösung erfordert das Erstellen einer neuen Fernbedienung gitlab_as_me, und ich mochte es nicht, die zusätzliche Fernbedienung in meinem Protokollbaum zu sehen, also entferne ich sie, wenn ich fertig bin
  • Um die Fernbedienung zu erstellen, muss generiert werden die remote-url-on-the-fly - in die Fall von gitlab erreicht wurde dies mit einem einfachen bash - Schnitt
  • Wenn Sie einen Push auf gitlab_as_me ausführen, müssen Sie genau wissen, welchen Zweig Sie drücken
  • Nach dem Ausführen des Push muss Ihr lokaler origin Zeiger "aktualisiert"werden, um gitlab_as_me (der git pull origin $branch tut dies)
 0
Author: dtmland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-01-07 18:26:23

Wenn Sie mehrere Git-Konten haben und einen anderen SSH-Schlüssel wünschen

Sie müssen denselben Schritt zum Generieren des ssh-Schlüssels ausführen, aber seien Sie sicher Sie

ssh-keygen -t ed25519 -C [email protected]

Geben Sie den Pfad ein, den Sie speichern möchten(z. B. my-pc/Desktop/.ssh/ed25519)

Hinweis: ed25519 ist der Ordnername

Fügen Sie den öffentlichen Schlüssel zu Ihrem gitlab hinzu (Hinzufügen des ssh-Schlüssels zu gitlab)

Sie müssen eine neue ssh-Identität mit dem folgenden comand

ssh-add ~/my-pc/Desktop/.ssh/ed25519
 0
Author: Srikrushna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2021-02-04 04:43:38