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!


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/* 

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


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"
}

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 )


14

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

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

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.


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.


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/


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.


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

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/*


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.