Gibt es eine Möglichkeit für eine SSH-Konfigurationsdatei, eine andere aufzunehmen?

131

Falls es darauf ankommt:

  • Betriebssystem: Ubuntu 10.04
  • SSH: OpenSSH_5.3p1 Debian-3ubuntu5

Ich möchte, dass eine SSH-Konfigurationsdatei eine andere enthält. Der Anwendungsfall wäre, zu definieren, was ich will in meiner Standarddatei .ssh/configund dann ein paar zusätzliche Dinge in einer separaten Datei (z ~/.ssh/foo.config. B. ) voranstellen . Ich möchte, dass die zweite Datei die erste enthält, damit ich nicht alles in der ersten duplizieren muss. Ist das machbar? Vielen Dank!

Joe Casadonte
quelle
2
Dieselbe Frage zu serverfault: serverfault.com/questions/375525/…
guettli

Antworten:

140

Ab 7.3p1 gibt es das IncludeSchlüsselwort, mit dem Sie Konfigurationsdateien einfügen können.

Include

    Fügen Sie die angegebenen Konfigurationsdateien ein. Es können mehrere Pfadnamen angegeben werden, und jeder Pfadname kann glob (3) -Platzhalter und für Benutzerkonfigurationen shellartige "~" -Verweise auf Benutzerverzeichnisse enthalten. Es wird angenommen, dass Dateien ohne absolute Pfade ~/.sshin einer Benutzerkonfigurationsdatei oder /etc/sshin der Systemkonfigurationsdatei enthalten sind.  IncludeDie Direktive kann innerhalb eines Matchoder eines HostBlocks erscheinen, um eine bedingte Einbeziehung durchzuführen.
Quelle: ssh_config (5) .

Zum Beispiel könnten Sie in ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

und in ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

Verwenden Sie in den Kommentaren das Folgende, um alle Dateien in das config.dVerzeichnis aufzunehmen:

Include config.d/* 
Osaka
quelle
13
check version with $ ssh -V
Pieter
7
Verwenden Sie Include config.d/*diese Option , um alle Einträge in aufzunehmen config.d.
Simon Woodside
17
Ftr: Dies muss oben in der Datei stehen und kann nicht einfach an die Liste der HostEinträge angehängt werden .
dtk
2
auf Ubuntu 16.04 ausprobiert. Es funktioniert zwar, aber die Autovervollständigung ist fehlerhaft , was es weniger nützlich macht. Wenn Sie ssh auf Ubuntu aktualisieren möchten, überprüfen Sie diesen Link gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu
@dtk danke dafür. Das hat mich überrascht
Adam Keenan
28

Nein, meines Wissens ist dies nicht möglich.

Hier sind die Links zu den entsprechenden offenen Feature Requests / Bug Tickets:

https://bugzilla.mindrot.org/show_bug.cgi?id=1585

https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495

rems
quelle
2
Auch dieser Fehler unter Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís
8
OH MEIN GOTT. Es geschieht. Vom 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk
Diese Antwort war zu der Zeit korrekt, ist aber jetzt veraltet.
Mark Stosberg
25

Wenn Sie einen ssh-Client starten möchten, können Sie dies in bash tun:

#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'

dann benutzt du ssh normal und es werden beide Dateien in dieser Reihenfolge gelesen.

Für den Server-Daemon können sshdSie das Gleiche tun , indem Sie -fanstelle von einfach -Faufschreiben, wo Sie den Daemon direkt starten. Du brauchst keinen Alias.

Eine zweite Möglichkeit besteht laut Manpage darin, die systemweite Konfiguration /etc/ssh/ssh_configund die Benutzerkonfiguration einzugeben ~/.ssh/config.

Update Anscheinend gibt es ein Problem mit einigen Bash-Versionen und wie die Geräte erstellt werden. (siehe http://bugs.alpinelinux.org/issues/1465 )

Dies ist eine Problemumgehung (obwohl meiner Meinung nach hässlich):

mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo & 
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo

Wenn Sie möchten, können Sie daraus eine Funktion (oder ein Skript) erstellen:

ssh() {
    tmp_fifo=$(mktemp -u --suffix=_ssh_fifo)
    mkfifo "$tmp_fifo" 
    cat ~/.ssh/config ~/.ssh/foo.config >"$tmp_fifo" 2>/dev/null & 
    /usr/bin/ssh -F "$tmp_fifo" "$@"
    rm "$tmp_fifo"
}
estani
quelle
1
Leider funktioniert dies unter OSX nicht. Ssh: Benutzer-Konfigurationsdatei / dev / fd / 63 kann nicht geöffnet werden: Ungültiger Dateideskriptor
Ash Berlin-Taylor
Es funktioniert bei mir auch unter (Ubuntu 11.10) Linux nicht und gibt den gleichen Fehler aus wie @AshBerlin oben.
Szymon Jeż
@AshBerlin Sie können es auch versuchen, dies sollte auch für OSX funktionieren, bis der Fehler behoben ist
estani
Wenn ssh drei Stellen überprüft, 1. Befehlszeile, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, sollten Sie ~/.ssh/configdie Befehlszeile nicht ebenfalls weitergeben müssen . Nur alias ssh='ssh -F ~/.ssh/foo.config'und ~/.ssh/configsollte danach abgeholt werden. Solange es Ihnen nichts ausmacht foo.config, zuerst geladen zu werden, sollte dies sauberer sein als die oben beschriebene Problemumgehung.
jim
1
@ Jim Nein, es funktioniert nicht so. Der erste gefundene wird verwendet. Hast du es versucht? von der Manpage "-F Konfigurationsdatei: Gibt eine alternative Konfigurationsdatei pro Benutzer an. Wenn eine Konfigurationsdatei in der Befehlszeile angegeben wird, wird die systemweite Konfigurationsdatei (/ etc / ssh / ssh_config) ignoriert."
Estani
17

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

Include : Schließt die angegebene (n) Konfigurationsdatei (en) ein. Es können mehrere Pfadnamen angegeben werden, und jeder Pfadname kann globale Platzhalter und Shell-ähnliche "~" Verweise auf Benutzer-Ausgangsverzeichnisse enthalten. Dateien ohne absoluten Pfad werden als in angenommen ~/.ssh. Eine IncludeDirektive kann innerhalb eines Matchoder eines HostBlocks erscheinen, um die bedingte Aufnahme 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
14

Ähnlich wie bei den anderen "hässlichen" hier ist mein Einzeiler:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
Aleksandr Makov
quelle
Beachten Sie, dass der sftpBefehl keine Neuberechnung der Konfiguration auslöst.
VasyaNovikov
2
(Ich mag die Antwort immer noch, weil es "config.d /" verwendet und sehr einfach ist.)
VasyaNovikov
2
simpel, elegant und doch hacky
code_monk
6

Nun, ich betrüge ein bisschen, um das zu tun. In meinen .profile-ish-Bash-Dateien gibt es einen Block, der beim Anmelden verschiedene Teile meines Home-Verzeichnisses ersetzt. Daher erstelle ich jedes Mal einen neuen. Beispiel:

rm ~/.ssh/config
cat ~/conf/myservers.sshconfig >> ~/.ssh/config

[ -f ~/conf/workservers.sshconfig ] && cat ~/conf/workservers.sshconfig >> ~/.ssh/config
(or something like this:)
for i in `ls ~/conf/sshconfigs` ; do
    cat $i >> ~/.ssh/config
done

chmod 600 ~/.ssh/config

Auf diese Weise kann ich der ssh-Konfigurationsdatei nur Konfigurationsblöcke hinzufügen, wenn ich mich auf Host A oder B, aber nicht auf meinen Heimsystemen befinde.

Jetzt weiß ich, dass sich jemand darüber beschwert, dass ein häufiges Anmelden zu einer übermäßigen Verlangsamung führen kann. In der Praxis habe ich das jedoch nie bemerkt. Und ich bin sicher, Sie könnten dies in ein Skript einfügen und es auch über cron auslösen.

Dave
quelle
3

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
Sie könnten einen Schritt weiter gehen und kombinieren diese mit fswatch, für die automatisierte Erstellung auf Datei ändern
Kavalkade
3

Eine andere, FUSE-basierte Lösung (selbst nicht getestet):

https://github.com/markhellewell/sshconfigfs

"Anstatt weiterhin eine große Datei verwalten zu müssen, [...] erstellen Sie stattdessen eine Konfigurationsdatei dynamisch aus vielen kleineren logischen Blöcken."

Ich habe auch einen Artikel über FIFOs gefunden: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/

amontero
quelle
1
Ich finde den Inhalt des Kommentars beschreibend genug - es steht "FUSE" (vielleicht ist es besser, das Akronym zu erweitern); Der Link ist nur zu einer Implementierung.
Aviv
1
War sich des Problems mit kurzen Antworten nicht bewusst, antworte erweitert. Es sieht so aus, als müsste ich von Zeit zu Zeit auf der Website nach meinen Antworten suchen, da keine E-Mail-Benachrichtigungen vorliegen :) Ich habe gelernt, Favoriten zu verwenden. Danke für die Kommentare.
Amontero
2

Keine dieser Alias-Lösungen funktioniert für gitandere Programme als ssh.

Ich habe einen schnellen und schmutzigen zusammengeschlagen, aber Sie möchten ihn vielleicht verbessern.

Fügen Sie dieses Ihrem hinzu ~/.bashrc

mkdir -p ~/.ssh/config.d/
[ -e ~/.ssh/config ] && mv ~/.ssh/config ~/.ssh/config.bak.$(date -Ins)
cat ~/.ssh/config.d/* > ~/.ssh/config

Jedes Mal, wenn Sie eine Sitzung starten, werden alle Dateien in zusammengeführt ~/.ssh/config.d. (Zeile 3)

Der Nachteil dieser Version ist, dass wenn Sie die ~/.ssh/confignächste Sitzung ändern, Ihre Änderungen verloren gehen, um zu verhindern, dass ich die vorhandene Datei in eine .bak-Datei verschiebe. (Zeile 2) Das Problem ist, dass Sie nach einer Weile eine Menge .bak-Dateien haben werden.

Dean Rather
quelle
Hervorragend mit einigen is_anything_changedBedingungen
vp_arth
1

Sie können die SSH-Version von Ubuntu auf Version 7.3 (getestet auf Ubuntu Xenial 16.04) problemlos aktualisieren, indem Sie Pakete von Yakkety installieren:

echo "deb http://archive.ubuntu.com/ubuntu yakkety main" > /etc/apt/sources.list.d/yakkety.list
apt-get update
apt-get install -y ssh
rm /etc/apt/sources.list.d/yakkety.list
apt-get update

Überprüfen Sie die SSH-Version

ssh -V
OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016

Konfigurieren Sie SSH für die Verwendung von Includes aus dem Verzeichnis ~ / .ssh / config.d

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config
panticz.de
quelle
0

Meine dumme Antwort:

  • Versucht, OpenSSH> 7.3 auf Xenial (16.04) zu installieren
  • Ich mochte das Durcheinander nicht

Also habe ich mich damit abgefunden:

  • Behalten Sie Ihre separaten OpenSSH-Konfigurationsdateien bei ~/.ssh/config.d/
  • Wenn Sie einen ändern, tun Sie cat ~/.ssh/config.d/* > ~/.ssh/config
  • An dem großartigen Tag, an dem Sie ein Upgrade auf eine Distributionsversion mit OpenSSH 7.3p1 oder neuer durchführen, können Sie stattdessen eine Datei erstellen, die Folgendes enthält

Include config.d/*

Adrian
quelle
0

Ich kann auf meinem Computer auch kein SSH-Upgrade durchführen.

Ich habe GNU make verwendet, um die SSH-Konfigurationsdatei nur bei Bedarf zu generieren :

# Concatenates all the .config files.
aInput  = *.config
aOutput = ~/.ssh/config

aCurrentMakefile = $(lastword $(MAKEFILE_LIST))

$(aOutput): $(shell ls $(aInput)) $(aCurrentMakefile)
    @echo "Generating $(aOutput)"
    @echo "# File generated by $(aCurrentMakefile) on $(shell date +'%F %T.%6N')" > $(aOutput)
    @cat $(aInput) >> $(aOutput)

Dann ist ssh auf voreingenommen

alias ssh='make -s -f ~/Tools/config.d/makefile -C ~/Tools/config.d && ssh'

Es wirkt wie ein Zauber.

gmathio
quelle