it-swarm.com.de

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

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 immer ich möchte, in meiner .ssh/config-Standarddatei und dann ein paar zusätzliche Dinge in einer separaten Datei (z. B. ~/.ssh/foo.config) anzuhängen. 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!

126
Joe Casadonte

Ab 7.3p1 gibt es das Schlüsselwort Include, 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 Shell-ähnliche „~“ -Verweise auf Benutzerverzeichnisse enthalten. Es wird davon ausgegangen, dass sich Dateien ohne absolute Pfade in ~/.sshif befinden, das in einer Benutzerkonfigurationsdatei enthalten ist, oder in /etc/sshif, das in der Systemkonfigurationsdatei enthalten ist. Die Anweisung Include kann in einem Block Match oder Host zur Ausführung einer bedingten Einbeziehung erscheinen .
Quelle: ssh_config (5) .

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

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 im Verzeichnis config.d einzuschließen:

Include config.d/* 
129
Osaka

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

28
rems

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 sshd können Sie dasselbe tun, indem Sie einfach -f anstelle von -F verwenden und dies dort notieren, wo Sie den Daemon direkt starten. Du brauchst keinen Alias.

Eine zweite Möglichkeit besteht laut Manpage darin, die systemweite Konfiguration in /etc/ssh/ssh_config und die des Benutzers in ~/.ssh/config einzutragen.

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" "[email protected]"
    rm "$tmp_fifo"
}
24
estani

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

Include : Enthält die angegebenen Konfigurationsdateien. Es können mehrere Pfadnamen angegeben werden, und jeder Pfadname kann globale Platzhalter und Shell-ähnliche "~" Verweise auf Benutzer-Ausgangsverzeichnisse enthalten. Dateien ohne absolute Pfade werden als ~/.ssh angenommen. Eine Include-Direktive kann in einem Match- oder Host-Block 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 )

17
Christian Hudon

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

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
14
Aleksandr Makov

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.

6
Dave

Eine andere, Fuse-basierte Lösung (nicht selbst 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/

3
amontero

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.

3
Szymon Jeż

Keine dieser Alias-Lösungen funktioniert für git oder andere Programme als ssh.

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

Fügen Sie dies Ihrem ~/.bashrc hinzu

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 ~/.ssh/config.d zusammengeführt. (Zeile 3)

Der Nachteil dieser Version ist, dass beim nächsten Öffnen von ~/.ssh/config 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.

2
Dean Rather

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
1
panticz.de

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 in ~/.ssh/config.d/
  • Wenn Sie einen ändern, führen Sie cat ~/.ssh/config.d/* > ~/.ssh/config aus.
  • 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/*

0
Adrian

Ich kann SSH auf meinem Computer auch nicht aktualisieren.

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.

0
gmathio