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


Wir haben einen Bastion-Server, mit dem wir uns mit mehreren Hosts verbinden, und unsere .ssh / config ist auf über tausend Zeilen angewachsen (wir haben Hunderte von Hosts, mit denen wir uns verbinden). Das fängt an, etwas unhandlich zu werden und ich würde gerne wissen, ob es eine Möglichkeit gibt, die .ssh / config Datei in mehrere Dateien zu zerlegen. Im Idealfall würden wir irgendwo angeben, dass andere Dateien als .ssh / config-Datei behandelt werden, möglicherweise wie:

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

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


67
2018-03-31 17:47


Ursprung


Jeder Benutzer muss sich mit seinem eigenen Benutzernamen beim Bastion-Host anmelden. Auch, was fügst du in die Konfigurationsdatei ein, die einen Eintrag für jeden Wirt erfordert? Können Sie nicht einige Standardeinstellungen festlegen? - Jed Daniels
Die gleiche Frage auf superuser.com: superuser.com/questions/247564/... - guettli
Bald sollte das in OpenSSH 7.3 möglich sein. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25 - azmeuk


Antworten:


Das ~/.ssh/config Datei enthält keine Anweisung zum Einbinden anderer Dateien, möglicherweise im Zusammenhang mit SSHs Prüfung auf Dateiberechtigungen.

Vorschläge hierzu können ein Skript enthalten, um mehrere Änderungen entweder auf dem System oder über Check-In-Haken in einem Repository zu erfassen. Man könnte sich auch Tools wie Puppet oder Augias ansehen.

Wie dem auch sei, Sie müssen einzelne Dateien als eine Datei außerhalb der Datei verketten.

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

Hinweis:  überschreiben: >  vs. anhängen: >>

Update Dezember 2017:

Ab 7.3p1 gibt es die Option Einschließen. Mit dieser Option können Sie Konfigurationsdateien hinzufügen.

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.

41
2018-03-31 18:01



Danke Jeff, das ist eine gute Idee. Ich weiß nicht viel über Puppet oder Augeas, deshalb ist es am besten, die Dinge so einfach wie möglich zu halten. 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


Sie können die aktuelle Konfigurationsdatei zur Verwendung in der ssh-Option wie folgt angeben:

ssh -F /path/to/configfile

Scheint, es ist der einzige Weg.

Außerdem gibt es jetzt auch die Möglichkeit, eine Konfiguration in eine andere zu integrieren.


40
2018-03-31 18:06



Eine nützliche Option, wenn Perls Net :: OpenSSH-Modul verwendet wird (z. B. für mehrere private Schlüsseldateien), wobei das Modul nicht alle Möglichkeiten bietet. - Jimmy Koerting


Beginnend mit ssh 7.3 (veröffentlicht am 1. August 2016), ein Include Direktive ist verfügbar.

Umfassen: Fügen Sie die angegebene (n) Konfigurationsdatei (en) hinzu. Mehrfacher Pfad   Namen können angegeben werden und jeder Pfadname kann glob enthalten   Platzhalter und Shell-ähnliche "~" Verweise auf Benutzer-Home-Verzeichnisse.   Dateien ohne absolute Pfade werden als in angenommen ~/.ssh. Ein    Include Direktive kann in einem erscheinen Match oder Host blockieren zu   Conditional Inclusion durchführen.

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


30
2017-07-11 15:19



Das ist zu cool. Freuen Sie sich darauf. Es sollte endlich dieses Problem richtig lösen :) - wrangler
Fügen Sie einfach die Include-Anweisung oben in der Zeile hinzu config Datei. Ich kann nicht herausfinden, warum es nicht unten funktioniert. - pylover


Ich persönlich benutze diese Befehle um die ssh config 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 nicht für mich, zurück:

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

Hoffe, das wird helfen.


16
2017-11-27 15:07



ssh -F <(cat .ssh/*.config) wäre ideal. Ich bin auch dazu gekommen, aber ich bekomme denselben Fehler. Wer weiß, was ist das Problem hier? - sickill
ssh überprüft Dateiberechtigungen, ich denke, diese Art von Weiterleitung unterstützt diese Überprüfung nicht. - Camden Narzt


Ich würde auch verwenden cat config_* > config um die gesamte Konfiguration zu generieren. Aber ich würde dafür weder puppet / cfengine etc. verwenden, wenn sie noch nicht vorhanden sind (BTW: warum nicht ein Config-Management-System verwenden ???).

Ich würde ein Paket (deb, rpm) generieren und es in ein lokales Repository legen. 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.


2
2018-03-31 19:34





Sie könnten ein Makefile in verwenden ~/.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

Dann bewege dein bestehendes config zu config.in und Renn make generieren config.


0
2018-05-04 22:18





Ich habe mit dem Konzept von a gespielt config.d Verzeichnis für meine Konfiguration organisieren. Also, um den obigen Stapel von Optionen hinzuzufügen, hier ist, was für mich gearbeitet hat.

Die Verzeichnisstruktur ist etwas wie

~/.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
}

Optional hinzufügen sshMakeConfig ganz unten in der run-config, wenn Sie bei jeder Shell-Sitzung eine neue Konfiguration sicherstellen wollen

Immer wenn ich meine ~ / .ssh / config neu kompilieren muss, mache ich das, indem ich renne sshMakeConfig in irgendeiner Form (direkt, meine Run-Config Sourcing oder eine neue Shell zu starten)


0
2018-03-16 12:59