Wie mache ich git mit ssh-add (wenn nötig)?

2116
Charlie

Unter Linux (CentOS, falls das wichtig ist) habe ich ein Problem mit git-Befehlen. git kann die im ssh-agent-Cache geladenen Schlüssel nutzen, aber wenn die Schlüssel nicht geladen werden, scheint es nicht erforderlich zu sein, sie zu laden (z. B. den Aufruf von ssh-add).

Ich habe ~ / .ssh / config so eingerichtet:

$ cat ~/.ssh/config  Host github.com User git PreferredAuthentications publickey IdentityFile ~/.ssh/github_id_rsa 

Mein System hat bereits ssh-agent eingerichtet. Ich glaube, es verwendet eine von Gnome bereitgestellte Implementierung ( http://live.gnome.org/GnomeKeyring/Ssh ).

Ich kann meinen Github-Schlüssel manuell mit dem Befehl "ssh-add" hinzufügen. Wenn ich dies tue, kann ich sehen, dass der Schlüssel mit "git add -l" geladen wird und die git-Befehle, die sich remote verbinden (z. B. "git remote update"), ohne Eingabe einer Passphrase funktionieren.

Ich möchte immer noch, dass git-Befehle Folgendes tun:

  • Wenn ssh-agent ausgeführt wird und der erforderliche Schlüssel noch nicht geladen ist, verwenden Sie ssh-add standardmäßig, um den Schlüssel in den ssh-agent zu laden.

  • ssh-add scheint Hilfe (über einen Parameter) zu benötigen, wenn es sich bei der Schlüsseldatei nicht um einen der Standarddateinamen handelt (z. B. 'id_rsa', 'id_dsa' oder 'identity'). Das scheint rückwärts. Ich habe eine Zuordnung von Hostname zu IdentityFile angegeben in ~ / .ssh / config wie oben gezeigt. Sollte ssh-add das nicht nutzen können?

Ebenfalls...

  • Um das Problem zu vereinfachen, habe ich versucht, die 'IdentityFile'-Zuordnung von ssh-config zu entfernen und die Schlüsseldateien in die Standardnamen (id_rsa und id_rsa.pub) umzubenennen. Dies erlaubt "ssh-add", den Schlüssel ohne zusätzliche Argumente hinzuzufügen, aber selbst in diesem vereinfachten Szenario sehe ich keine git-Befehle, die dem ssh-agent-Cache Schlüssel hinzufügen.

Ich habe dasselbe ~ / .ssh / config auf meinem MacOS (Snow Leopard) -Maschine, und es scheint genau das Richtige zu tun. Aber wie bekomme ich dieses Verhalten in Linux? Ich bin nicht sicher, ob dies auf einen Unterschied in der Implementierung oder Konfiguration von ssh-agent, ssh-add, git oder einer Kombination zurückzuführen ist.

Edit: Nachdem ich ein bisschen darüber nachgedacht habe, denke ich, dass dies viel mehr mit den ssh-Tools (vielleicht am wichtigsten ssh-agent?) Als mit git zu tun haben sollte. Schließlich sollte dieses Verhalten für jeden Prozess, der versucht, ssh-Verbindungen herzustellen, unter Verwendung der Schlüssel und Einstellungen in ~ / .ssh, einschließlich des Befehls ssh, gleich sein.

0

3 Antworten auf die Frage

4
Chris Johnsen

Default OpenSSH macht einfach nicht das, was Sie wollen. Die ssh Programm verwendet einen beliebigen Schlüssel, der bereits in den konfigurierten Agenten geladen ist, fügt dem Agenten jedoch keine Schlüssel hinzu.

Das Verhalten „Hinzufügen eines von ssh verwendeten passwortgeschützten Schlüssels zum Agenten “ ist darauf zurückzuführen, dass Apples die Version von ssh, die mit Mac OS X gebündelt wird, ändert.


Eine typische Ausführung von ssh wird load_identity_filevon verwendetsshconnect2.c .

Apple fügt zu load_identity_fileeinem Anruf keychain_read_passphrasevon hinzukeychain.c (diese Datei stammt vollständig von Apple).

keychain_read_passphraseverwendet ssh_add_identity_constrainedvon authfd.c, um den geladenen Schlüssel im Agenten zu speichern.

Der einzige andere Benutzer von ssh_add_identity_constrainedis ssh-add.c( ssh-add ); die unterste Ebene „Konstanten“ SSH2_AGENTC_ADD_IDENTITYund SSH2_AGENTC_ADD_ID_CONSTRAINEDwerden auch nur authfd.cin ssh-agent.c( ssh-agent ) verwendet.

Daher lädt normalerweise nur ssh-add Schlüssel in den Agenten, aber Apple erweitert ssh, um auch Schlüssel in den Agenten zu laden, wenn seine GUI nach der Passphrase eines Schlüssels fragt.

Vielen Dank für eine sehr gründlich recherchierte Antwort! Ich denke, der einzige verbleibende Teil der Frage ist "Wie kann ich dieses Verhalten in Linux bekommen?" Es sieht so aus, als hätten Sie einen verkauften Fall gemacht, dass dies mit Standard-OpenSSH allein nicht möglich ist. Ich denke, der Ort zum Nachschlagen liegt wahrscheinlich in den Tools, die mit Desktop-Umgebungen bereitgestellt werden, z. Charlie vor 13 Jahren 0
ps Ich wollte diese Antwort wirklich positiv bewerten, aber die Website sagt mir, dass ich nicht genug Ruf habe, um das zu tun :( Charlie vor 13 Jahren 0
1
go2null

Unterstützung für OpenSSH v7.2 wurde hinzugefügt AddKeysToAgent.

  • ssh (1): Fügen Sie eine AddKeysToAgent-Clientoption hinzu, die auf
    'yes', 'no', 'ask' oder 'confirm' gesetzt werden kann. Der Standardwert ist 'no'. Wenn
    aktiviert, wird ein privater Schlüssel, der während der Authentifizierung verwendet wird,
    zu ssh-agent hinzugefügt, wenn er ausgeführt wird (wenn
    die Bestätigung aktiviert ist, wenn er auf 'confirm' gesetzt ist).

Apple hat diesen OpenSSH-Standard in macOS 10.12.2 übernommen .

OpenSSH lädt die Schlüssel nicht mehr automatisch in den ssh-agent. Dadurch wird das macOS-Verhalten an das des Upstream-OpenSSH-Projekts angepasst.

Der Benutzer kann das Laden von Schlüsseln in den Agenten durch Aktivieren dieser Option in der ssh-Konfigurationsdatei wieder aktivieren:

AddKeysToAgent ja

0
Charlie

Kurze Antwort: OpenSSH unterstützt dies nicht, aber geänderte Versionen oder alternative Implementierungen von ssh-bezogenen Tools können dies tun.

Längere Antwort:

OpenSSH tut dies nicht aus den Gründen, die in der Antwort von Chris Johnsen auf dieser Seite genannt werden. Es ist jedoch möglich, dieses Verhalten unter Linux mithilfe von Gnome Keyring zu ermitteln, das seinen eigenen ssh-agent bereitstellt.

In der Frage, die ich gepostet hatte, sagte ich, dass ich dachte, ich würde Gnome Keyring verwenden (da ich Gnome verwendete), aber ich nicht. Ich hatte gerade CentOS 5 installiert, und in diesem Setup bin ich ziemlich sicher, dass der ssh-agent-Daemon der von OpenSSH war.

Ich habe dies noch einmal mit Ubuntu 11.04 versucht, das auf jeden Fall den ssh-agent von Gnome Keyring verwendet. In diesem Setup bekomme ich das gewünschte Verhalten in der Frage.