Können Sie mehr als eine ~ / .ssh / config-Datei haben?

82

Wir haben einen Bastion-Server, mit dem wir eine Verbindung zu mehreren Hosts herstellen, und unsere .ssh / config ist auf über tausend Zeilen angewachsen (wir haben Hunderte von Hosts, mit denen wir eine Verbindung herstellen). Dies wird langsam unhandlich und ich würde gerne wissen, ob es eine Möglichkeit gibt, die .ssh / config-Datei in mehrere Dateien aufzuteilen. Im Idealfall geben wir irgendwo an, dass andere Dateien als .ssh / config-Datei behandelt werden sollen, möglicherweise wie folgt:

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...

Ich habe die Dokumentation zu ssh / config gelesen und sehe nicht, dass dies möglich ist. Aber vielleicht hat jemand anderes ein ähnliches Problem gehabt und eine Lösung gefunden.

Wrangler
quelle
Jeder Benutzer muss sich mit seinem eigenen Benutzernamen beim Bastion-Host anmelden. Was fügen Sie in die Konfigurationsdatei ein, für die für jeden Host ein Eintrag erforderlich ist? Können Sie nicht einige Standardeinstellungen festlegen, die häufig verwendet werden?
Jed Daniels
1
Gleiche Frage auf superuser.com: superuser.com/questions/247564/...
guettli
1
In OpenSSH 7.3 sollte dies bald möglich sein. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

Antworten:

51

Die ~/.ssh/configDatei enthält keine Direktive zum Einschließen anderer Dateien, möglicherweise im Zusammenhang mit der Überprüfung von SSH auf Dateiberechtigungen.

Vorschläge dazu können ein Skript enthalten, um mehrere Änderungen gemeinsam entweder auf dem System oder über Check-in-Hooks in einem Repository vorzunehmen. Man könnte sich auch Tools wie Puppet oder Augeas ansehen.

Wie auch immer Sie vorgehen, Sie müssen einzelne Dateien verketten, um eine einzelne Datei von außerhalb der Datei zu erhalten.

$ cat ~/.ssh/config_* >> ~/.ssh/config

hinweis: überschreiben: > vs anhängen:>>

Update Dezember 2017:

Ab 7.3p1 gibt es die Option Einschließen. Womit Sie Konfigurationsdateien einbinden können.

Include
    Include the specified configuration file(s).  Mul‐
    tiple pathnames may be specified and each pathname
    may contain glob(3) wildcards and, for user config‐
    urations, shell-like “~” references to user home
    directories.  Files without absolute paths are
    assumed to be in ~/.ssh if included in a user con‐
    figuration file or /etc/ssh if included from the
    system configuration file.  Include directive may
    appear inside a Match or Host block to perform con‐
    ditional inclusion.
Jeff Ferland
quelle
Danke Jeff, das ist eine gute Idee. Ich weiß nicht viel über Puppet oder Augeas. Um die Dinge so einfach wie möglich zu halten, scheint Ihre Lösung die beste zu sein. Ich könnte die Konfiguration in mehrere Konfigurationen aufteilen und ein einfaches Skript erstellen, um die .ssh / config-Datei neu zu erstellen, wenn eine der Dateien geändert wird. Ich weiß nicht, wie sauber eine Lösung ist, aber es scheint den Trick zu machen und funktioniert für meine Zwecke.
Wrangler
52

Sie können die aktuelle Konfigurationsdatei für die Verwendung in der Option ssh wie folgt angeben:

ssh -F /path/to/configfile

Scheint, es ist der einzige Weg.

Außerdem gibt es heutzutage die Möglichkeit, eine Konfiguration in eine andere aufzunehmen.

eilen
quelle
Eine schöne Option, wenn Sie das Net :: OpenSSH-Modul von Perl verwenden (z. B. für mehrere private Schlüsseldateien), bei dem das Modul nicht alle Möglichkeiten bietet.
Jimmy Koerting
36

Ab ssh 7.3 (veröffentlicht am 1. August 2016) ist eine IncludeDirektive verfügbar.

Include : Enthält die angegebenen Konfigurationsdateien. Es können mehrere Pfadnamen angegeben werden, und jeder Pfadname kann globale Platzhalter und "~" - Verweise auf Benutzerverzeichnisse enthalten. Dateien ohne absoluten Pfad werden als in angenommen ~/.ssh. Eine IncludeDirektive kann innerhalb eines Matchoder eines HostBlocks erscheinen, um eine bedingte Einbeziehung durchzuführen.

(Hier ist der Link zum behobenen Fehlerbericht, der auch den Patch enthält: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )

Christian Hudon
quelle
2
Das ist zu cool. Freuen Sie sich darauf. Es sollte endlich das Problem auf die richtige Weise lösen :)
Wrangler
2
Fügen Sie einfach die Include-Direktive oben in die configDatei ein. Ich kann nicht herausfinden, warum es unten nicht funktioniert.
Pylover
17

Ich persönlich benutze diese Befehle, um die ssh-Konfiguration zu kompilieren:

alias compile-ssh-config='echo -n > ~/.ssh/config && cat ~/.ssh/*.config > ~/.ssh/config'
alias ssh='compile-ssh-config && ssh'
# (This will get used by other programs depending on the ~/.ssh/config)
# (If you need you can run the compile-ssh-config command via cron etc.)

oder:

alias compile-ssh-config='echo -n > ~/.ssh/config-compilation && cat ~/.ssh/*.config > ~/.ssh/config-compilation'
alias ssh='compile-ssh-config && ssh -F ~/.ssh/config-compilation'
# (This is saver and won't over write an existing ~/.ssh/config file)

da:

alias ssh='ssh -F <(cat .ssh/*.config)'

funktioniert bei mir nicht und kehrt zurück:

ssh: Can't open user config file /dev/fd/63: Bad file descriptor

Ich hoffe, das wird Ihnen weiterhelfen.

Szymon Jeż
quelle
ssh -F <(cat .ssh/*.config)wäre ideal. Ich habe mir das auch ausgedacht, aber ich bekomme den gleichen Fehler. Weiß jemand, wo das Problem liegt?
Sichel
2
ssh überprüft die Dateiberechtigungen. Ich denke, diese Art der Weiterleitung unterstützt diese Überprüfung nicht.
Camden Narzt
2

Ich würde auch verwenden cat config_* > config, um die gesamte Konfiguration zu generieren. Aber ich würde dafür kein Puppet / Cfengine usw. verwenden, wenn sie noch nicht vorhanden sind.

Ich würde ein Paket (deb, rpm) generieren und es in ein lokales Repository stellen. Und im Postinst-Skript generiert die Katze Ihre Konfiguration. Vielleicht fügen Sie auch einen lokalen Ordner hinzu ... Der Vorteil ist, dass ssh / config updates täglich aktiviert werden, während cron-apt & Co ausgeführt wird.

ThorstenS
quelle
0

Sie könnten ein Makefile verwenden in ~/.ssh:

    config: config.in config.app.in
        > $@
        (for f in $+; do cat $$f; echo; done) | sed '$$ d' >> $@

    config.app.in:
        (echo "# Generated with foobar.sh."; \
            foobar.sh) > $@
    .PHONY: config.app.in

Bewegen Sie dann Ihr vorhandenes configzu config.inund führen Sie es aus make, um es zu generieren config.

bläulich
quelle
0

Ich habe mit dem Konzept eines config.dVerzeichnisses für meine Konfigurationsorganisation gespielt. Um den oben genannten Haufen von Optionen zu ergänzen, hier ist, was für mich gearbeitet hat.

Die Verzeichnisstruktur ist ungefähr so

~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish

Die Funktion, die die ~ / .ssh / config erstellt und in der run-config meiner Shell lebt, ist wie folgt

sshMakeConfig() {
    echo '# AUTOGENERATED by sshMakeConfig()' > ~/.ssh/config
    for i in ~/.ssh/config.d/*
        do echo "#${i}" | tee -a ~/.ssh/config
        cat ${i} >> ~/.ssh/config
    done
}

Fügen Sie optional sshMakeConfigam Ende Ihrer Run-Config hinzu, wenn Sie bei jeder Shell-Sitzung eine neue Konfiguration sicherstellen möchten

Jedes Mal, wenn ich meine ~ / .ssh / config neu kompilieren muss, führe ich dies sshMakeConfigin irgendeiner Form aus (direkt, über meine run-config oder durch Starten einer neuen Shell).

knüpfen
quelle