Kann ich Fehler in meiner SSH-Konfiguration ignorieren?

7

Ich führe ein Ubuntu-Image in einem Docker-Container aus, wobei mein SSH-Verzeichnis aus meiner nativen MacO-Umgebung bereitgestellt wird.

Meine .ssh / config-Datei enthält

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519_common

Dies funktioniert auf einem Mac einwandfrei, aber AddKeysToAgent und UseKeychain sind für Linux nicht gültig, und alles (z. B. Git), das das openssh-client-Paket verwendet, ignoriert nicht nur die nicht erkannten Anweisungen, sondern schlägt fehl und wird beendet.

Gibt es eine Möglichkeit, eine .ssh / config-Datei zu haben, mit der ich sie für Mac und Linux freigeben kann?

MEHColeman
quelle
Ich schlage vor, dass ein besserer Titel für diese Frage lautet: "Kann ich einige Einträge in der SSH-Konfiguration plattformabhängig machen, um die Mac + Linux-Freigabe zu aktivieren?"
Alex Stragies

Antworten:

11

Sie können das MatchSchlüsselwort in der ssh-Konfigurationsdatei verwenden, um einen Teil der Konfiguration so einzuschränken, dass er nur unter bestimmten Bedingungen angewendet wird . Für den Auszug in der Frage sollte etwa Folgendes funktionieren:

Host *
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_ed25519_common

Match exec "uname -s | grep Darwin"
    UseKeychain yes

Auf einem Linux-System gibt der grepFehler (1) zurück, und die folgenden Zeilen werden ignoriert. Auf dem Mac-Host gibt der grep den Erfolg (0) zurück und die UseKeychain yesZeile wird angewendet.

Der MatchBlock wird durch das nächste beendet Match, Hostoder das Ende der Datei.

Beachten Sie, dass dies AddKeysToAgentnicht plattformspezifisch ist, sondern seit Version 7.2 in OpenSSH verfügbar ist. Vermutlich verwenden Sie eine ältere Version von OpenSSH im Ubuntu-Container, jedoch nicht auf dem Mac-Host.

user4556274
quelle
1
solltest du grep -qhier verwenden?
Joshua
1
@Joshua Der Befehl von execwird ausgeführt, wobei das Standardout auf umgeleitet /dev/nullwird. Ich denke also nicht, dass dies einen Unterschied macht. Aber diese Antwort scheint sowieso nicht zu funktionieren. Es wird sich über die unbekannte Richtlinie beschweren, unabhängig davon, ob die MatchBedingung erfolgreich war oder fehlgeschlagen ist. Darüber hinaus, wenn die Bedingung ist Match exec "sleep 30; exit 19", wird es pflichtbewusst 30 Sekunden schlafen, dann beschweren Sie sich über eine unbekannte Anweisung und sterben ;-)
Mosvy
@MEHColeman Könnten Sie bitte die genaue Version von Ubuntu und SSH erwähnen, in der dies funktioniert hat? Ich bin einfach nicht in der Lage, es mit irgendeiner Version von openssh zum Laufen zu bringen - nicht einmal mit dem letzten openssh-portablen. Aber vielleicht haben die Ubuntu-Leute einige spezielle Patches dafür.
Mosvy
@mosvy Aah, ich habe unbewusst einen Fehler mit der obigen Antwort behoben - das Match-Schlüsselwort sollte wie die anderen Schlüsselwörter eingerückt werden. Dies funktioniert auf Ubuntu 18:04. Ich habe openssh-client (1: 7.6p1-4ubuntu0.3) installiert. Die andere Antwort hier funktioniert auch perfekt)
MEHColeman
Die Antwort von @ mosvy ist die richtige Antwort. Ich würde diese löschen, aber ich kann eine akzeptierte Antwort nicht löschen.
user4556274
4

Sie sollten die IgnoreUnknownRichtlinie frühzeitig in Ihrem ~/.ssh/config:

IgnoreUnknown   UseKeychain,AddKeysToAgent

Aus der ssh_config(5)Manpage:

IgnoreUnknown

Gibt eine Musterliste unbekannter Optionen an, die ignoriert werden sollen, wenn sie beim Parsen der Konfiguration auftreten. Dies kann verwendet werden, um Fehler zu unterdrücken, wenn ssh_configOptionen enthalten sind, die von nicht erkannt werden ssh(1). Es wird empfohlen, IgnoreUnknownfrüh in der Konfigurationsdatei aufgeführt zu werden, da diese nicht auf unbekannte Optionen angewendet wird, die davor angezeigt werden.


Bei allen Versionen, die opensshich testen konnte, verhindert eine fehlerhafte MatchBedingung nicht, dass sshFehler in folgenden Anweisungen auftreten, die ihr unbekannt sind:

$ cat ~/.ssh/config
Match !all
        Foobar yes
$ ssh localhost
/home2/ahq/.ssh/config: line 2: Bad configuration option: foobar
/home2/ahq/.ssh/config: terminating, 1 bad configuration options
Mosvy
quelle
Diese Antwort funktioniert auch perfekt. Vielen Dank!
MEHColeman