Czy istnieje sposób, aby jeden plik konfiguracyjny SSH zawierał inny?

131

W przypadku, gdy ma to znaczenie:

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

Chciałbym, aby jeden plik konfiguracyjny SSH zawierał inny. Przypadkiem użycia byłoby zdefiniowanie, co chcę w domyślnym .ssh/configpliku, a następnie wstępne umieszczenie kilku dodatkowych rzeczy w osobnym pliku (np ~/.ssh/foo.config.). Chcę jednak, aby drugi plik zawierał pierwszy, więc nie muszę duplikować wszystkiego w pierwszym. Czy to wykonalne? Dzięki!

Joe Casadonte
źródło
2
To samo pytanie o serverfault: serverfault.com/questions/375525/…
guettli

Odpowiedzi:

140

Od wersji 7.3p1 i wyższej istnieje Includesłowo kluczowe, które umożliwia dołączanie plików konfiguracyjnych.

Include

    Dołącz określone pliki konfiguracyjne. Można podać wiele nazw ścieżek, a każda nazwa ścieżki może zawierać symbole wieloznaczne glob (3) oraz, w przypadku konfiguracji użytkownika, podobne do powłoki odniesienia ~ ~ do katalogów domowych użytkowników. Przyjmuje się, że pliki bez ścieżek bezwzględnych znajdują się w ~/.sshpliku konfiguracji użytkownika lub /etc/sshw pliku konfiguracji systemu.  Includedyrektywa może pojawić się wewnątrz a Matchlub Hostbloku, aby wykonać włączenie warunkowe.
Źródło: ssh_config (5) .

Na przykład możesz mieć ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

oraz w ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

Z komentarzy użyj poniższych, aby dołączyć wszystkie pliki do config.dkatalogu:

Include config.d/* 
Osaka
źródło
13
sprawdź wersję za pomocą $ ssh -V
Pieter
7
Użyj, Include config.d/*aby uwzględnić wszystkie wpisy w config.d.
Simon Woodside,
17
Ftr: musi znajdować się na górze pliku i nie można go po prostu dołączyć do listy Hostwpisów.
dtk
2
wypróbowałem na Ubuntu 16.04. Chociaż działa, ale autouzupełnianie jest zepsute, co czyni go mniej użytecznym. Jeśli chcesz zaktualizować ssh na Ubuntu, sprawdź ten link gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu
@dtk dzięki za to. Właśnie to mnie dręczyło
Adam Keenan
28

Nie, o ile mi wiadomo, nie jest to możliwe.

Oto linki do odpowiednich otwartych żądań funkcji / zgłoszeń błędów:

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

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

rems
źródło
2
Również ten błąd w Debianie: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís
8
O MÓJ BOŻE. To się dzieje. Od 15.04.2016 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk
Ta odpowiedź była wówczas poprawna, ale teraz jest nieaktualna.
Mark Stosberg,
25

Jeśli chcesz uruchomić klienta ssh, możesz to zrobić w bash:

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

wtedy normalnie używasz ssh i oba pliki będą czytane w tej kolejności.

W przypadku demona serwera sshdmożesz zrobić to samo, po prostu użyj -fzamiast -Fi zapisz to w miejscu, w którym uruchamiasz demona bezpośrednio. nie potrzebujesz aliasu.

Drugą możliwością według strony podręcznika jest wprowadzenie konfiguracji całego systemu /etc/ssh/ssh_configi jednej użytkownika ~/.ssh/config.

Aktualizacja Wygląda na to, że jest jakiś problem z niektórymi wersjami bash i sposobem tworzenia urządzeń. (patrz http://bugs.alpinelinux.org/issues/1465 )

To obejście (choć moim zdaniem brzydkie):

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

więc jeśli chcesz, możesz utworzyć z niego funkcję (lub skrypt):

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
źródło
1
Niestety nie działa to na ssh OSX: Nie można otworzyć pliku konfiguracyjnego użytkownika / dev / fd / 63: Zły deskryptor pliku
Ash Berlin-Taylor
Nie działa dla mnie również w systemie Linux (Ubuntu 11.10), dając ten sam błąd, co @AshBerlin opublikowany powyżej.
Szymon Jeż
@AshBerlin też możesz spróbować, to powinno działać również dla OSX, dopóki błąd nie zostanie naprawiony
estani
Biorąc pod uwagę, że ssh sprawdza trzy miejsca, 1. linię poleceń, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, nie powinieneś również przekazywać ~/.ssh/configlinii poleceń. Tylko alias ssh='ssh -F ~/.ssh/foo.config'i ~/.ssh/configpowinno się podniósł po tym. Dopóki nie przeszkadza ci foo.configto, że najpierw zostanie załadowane, powinno to być czystsze niż powyższe obejście.
jim
1
@jim nie, to tak nie działa. Pierwszy znaleziony jest używany. Próbowałeś tego? ze strony podręcznika „-F plik konfiguracyjny : określa alternatywny plik konfiguracyjny dla użytkownika. Jeśli plik konfiguracyjny zostanie podany w wierszu poleceń, ogólnosystemowy plik konfiguracyjny (/ etc / ssh / ssh_config) zostanie zignorowany.”
estani
17

Począwszy od wersji ssh 7.3 (wydanej 1 sierpnia 2016 r.), IncludeDostępna jest dyrektywa.

Dołącz : dołącz określone pliki konfiguracyjne. Można podać wiele nazw ścieżek, a każda nazwa ścieżki może zawierać globalne symbole wieloznaczne i podobne do powłoki odniesienia ~ ~ do katalogów domowych użytkowników. Przyjmuje się, że pliki bez ścieżek bezwzględnych znajdują się w ~/.ssh. IncludeDyrektywa może się pojawić wewnątrz Matchlub Hostblokować wykonywanie włączenia warunkowego.

(Oto link do usuniętego raportu o błędzie, który obejmuje również łatkę: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )

Christian Hudon
źródło
14

Podobnie jak inne „brzydkie”, oto moje jedno-liniowe:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"
Aleksandr Makov
źródło
Zauważ, że sftppolecenie nie spowoduje ponownego obliczenia konfiguracji.
VasyaNovikov
2
(Wciąż podoba mi się odpowiedź, ponieważ używa „config.d /” i jest bardzo prosta.)
VasyaNovikov
2
proste, eleganckie, ale hacky
code_monk
6

Cóż, trochę oszukuję, aby to zrobić. W moich plikach .profile-ish bash mam blok, który zastępuje różne części mojego katalogu domowego podczas logowania, więc po prostu generuję nowy za każdym razem. Przykład:

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

Pozwala mi to także dodawać bloki konfiguracyjne do pliku konfiguracyjnego ssh tylko wtedy, gdy korzystam z hosta A lub B, ale nie w moich systemach domowych.

Teraz wiem, że ktoś się zorientuje, że jeśli dużo się zalogujesz, może to spowodować nadmierne spowolnienie, ale w praktyce nigdy tego nie zauważyłem. I jestem pewien, że możesz umieścić to w skrypcie i odpalić również za pomocą crona.

Dave
źródło
3

Osobiście używam tych poleceń do kompilacji konfiguracji ssh:

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.)

lub:

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)

dlatego:

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

nie działa dla mnie, zwracając:

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

Mam nadzieję, że to pomoże.

Szymon Jeż
źródło
Możesz pójść o krok dalej i połączyć to z fswatch, aby zautomatyzować kompilację przy zmianie plików
cavalcade
3

Kolejne rozwiązanie oparte na BEZPIECZNIKU (sam nie testowałem):

https://github.com/markhellewell/sshconfigfs

„Zamiast nadal zarządzać jednym dużym plikiem, [...] zamiast tego dynamicznie buduj„ plik konfiguracyjny ”z wielu mniejszych fragmentów logicznych”.

Znalazłem również artykuł robiąc to za pośrednictwem FIFO: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/

amontero
źródło
1
Uważam, że treść komentarza jest wystarczająco opisowa - mówi „FUSE” (być może rozszerzenie akronimu byłoby lepsze); Link jest tylko do implementacji.
aviv
1
Nie byłem świadomy problemu z krótkimi odpowiedziami, odpowiedź rozszerzona. Wygląda na to, że będę musiał od czasu do czasu sprawdzać witrynę pod kątem moich odpowiedzi, przy braku powiadomień e-mailowych :) Nauczyłem się teraz korzystać z ulubionych. Dziękuję za komentarze.
amontero
2

Żadne z tych rozwiązań aliasowych nie działa w przypadku gitinnych programów niż ssh.

Uderzyłem szybko i brudno, ale możesz chcieć to poprawić.

Dodaj to do swojego ~/.bashrc

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

Za każdym razem, gdy zaczynasz sesję, scala ona wszystkie pliki ~/.ssh/config.d. (linia 3)

Minusem tej wersji jest to, że jeśli zmienisz ~/.ssh/confignastępną sesję, otworzysz zmiany, które zostałyby utracone, aby zapobiec przeniesieniu istniejącego pliku do pliku .bak. (wiersz 2) Problem polega na tym, że po chwili będziesz mieć mnóstwo plików .bak.

Dean Rather
źródło
Doskonałe z dodaniem pewnego is_anything_changedwarunku
vp_arth
1

Możesz łatwo zaktualizować wersję SSH na Ubuntu do wersji 7.3 (testowanej na Ubuntu Xenial 16.04), instalując pakiety z Yakkety:

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

Sprawdź wersję SSH

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

Skonfiguruj SSH do użycia zawiera z katalogu ~ / .ssh / config.d

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config
panticz.de
źródło
0

Moja głupia odpowiedź:

  • Próbowałem zainstalować OpenSSH> 7.3 na Xenial (16.04)
  • Nie podobał mi się bałagan, który stworzył

Więc zdecydowałem się na to:

  • Zachowaj osobne pliki konfiguracyjne OpenSSH ~/.ssh/config.d/
  • Kiedy zmienisz jeden, zrób cat ~/.ssh/config.d/* > ~/.ssh/config
  • Chwalebnego dnia, gdy aktualizujesz do wersji dystrybucyjnej z OpenSSH 7.3p1 lub nowszą, możesz zamiast tego utworzyć plik zawierający

Include config.d/*

Adrian
źródło
0

Nie mogę także zaktualizować SSH na moim komputerze.

Użyłem GNU make do wygenerowania pliku konfiguracyjnego ssh tylko w razie potrzeby :

# 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)

Następnie ssh jest aliasowane do

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

To działa jak urok.

gmathio
źródło