Czy możesz mieć więcej niż jeden plik ~ / .ssh / config?

82

Mamy serwer bastionowy, którego używamy do łączenia się z wieloma hostami, a nasz .ssh / config urósł do ponad tysiąca linii (mamy setki hostów, z którymi się łączymy). To zaczyna być trochę nieporęczne i chciałbym wiedzieć, czy istnieje sposób na podzielenie pliku .ssh / config na wiele plików. Idealnie byłoby gdzieś określić, że inne pliki byłyby traktowane jako plik .ssh / config, prawdopodobnie jak:

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

Przeczytałem dokumentację dotyczącą ssh / config i nie widzę, aby było to możliwe. Ale może ktoś inny miał podobny problem i znalazł rozwiązanie.

kowboj
źródło
Niech każdy użytkownik zaloguje się do hosta bastionu przy użyciu własnej nazwy użytkownika. Co również umieszczasz w pliku konfiguracyjnym, który wymaga wpisu dla każdego hosta? Czy nie możesz ustawić wspólnych ustawień domyślnych?
Jed Daniels,
1
To samo pytanie na superuser.com: superuser.com/questions/247564/…
guettli
1
Wkrótce w OpenSSH 7.3 powinno to być możliwe. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

Odpowiedzi:

51

~/.ssh/configPlik nie mają dyrektywy o tym inne pliki, ewentualnie związane z czekiem ssh za uprawnienia do plików.

Sugestie wokół tego mogą obejmować skrypt do przechwytywania kilku zmian razem, zarówno w systemie, jak i za pomocą haczyków do sprawdzania w repozytorium. Można również przyjrzeć się narzędziom takim jak Puppet lub Augeas.

Jakkolwiek do tego podejdziesz, będziesz musiał połączyć poszczególne pliki w jeden plik spoza pliku.

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

uwaga: nadpisz: > vs dodaj:>>

Aktualizacja z grudnia 2017 r .:

Od wersji 7.3p1 i wyższej dostępna jest opcja Uwzględnij. Co pozwala dołączyć pliki konfiguracyjne.

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.
Jeff Ferland
źródło
Dzięki Jeff, to dobry pomysł. Nie wiem zbyt wiele o Puppet lub Augeas, więc dla uproszczenia wszystkiego, twoje rozwiązanie wydaje się najlepsze. Mógłbym podzielić konfigurację na wiele konfiguracji i stworzyć prosty skrypt, aby odtworzyć plik .ssh / config za każdym razem, gdy jeden z plików zostanie zmodyfikowany. Nie wiem, jak czyste jest to rozwiązanie, ale wydaje się, że rozwiązuje problem i działa dla moich celów.
wrangler
52

Możesz określić bieżący plik konfiguracyjny do użycia w opcji ssh, tak jak to:

ssh -F /path/to/configfile

Wydaje się, że to jedyny sposób.

Nie ma też możliwości włączenia jednej konfiguracji do drugiej.

wysypka
źródło
Fajnie jest mieć opcję, gdy używasz Perla Net :: OpenSSH Module (np. Dla wielu plików kluczy prywatnych.), Gdzie moduł nie daje wszystkich możliwości.
Jimmy Koerting
36

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 zawiera również łatkę: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )

Christian Hudon
źródło
2
To za fajne. Czekamy na to. Powinien w końcu rozwiązać ten problem we właściwy sposób :)
wrangler
2
Wystarczy dodać dyrektywę Uwzględnij u góry configpliku. Nie mogę zrozumieć, dlaczego nie działa na dole.
pylover
17

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
ssh -F <(cat .ssh/*.config)byłoby idealnie. Ja też to wymyśliłem, ale otrzymuję ten sam błąd. Czy ktoś wie, na czym polega problem?
sickill
2
ssh sprawdza uprawnienia do plików, myślę, że tego rodzaju przekierowania nie obsługują tego sprawdzania.
Camden Narzt,
2

Chciałbym również użyć cat config_* > configdo wygenerowania całej konfiguracji. Ale nie użyłbym do tego lalek / cfengine itp., Jeśli jeszcze ich nie ma (BTW: dlaczego nie użyć systemu zarządzania konfiguracją ???).

Wygenerowałbym pakiet (deb, rpm) i umieściłbym go w lokalnym repozytorium. W skrypcie postinst kot generuje konfigurację. Być może dołączasz także folder lokalny ... Zaletą jest to, że aktualizacje ssh / config aktywują się codziennie, podczas uruchamiania cron-apt & Co.

ThorstenS
źródło
0

Możesz użyć pliku Makefile w ~/.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

Następnie przenieść istniejące configdo config.ini uruchomić make, aby wygenerować config.

niebieskawy
źródło
0

Bawiłem się koncepcją config.dkatalogu do organizowania konfiguracji. Aby dodać do powyższego stosu opcji, oto, co dla mnie działa.

Struktura katalogów jest podobna

~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish

Funkcja, która buduje ~ / .ssh / config i żyje w run-config mojej powłoki, jest następująca

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
}

Opcjonalnie dodaj sshMakeConfigdo dolnej części swojego run-config, jeśli chcesz zapewnić nową konfigurację w każdej sesji powłoki

Za każdym razem, gdy muszę ponownie skompilować plik ~ / .ssh / config, robię to, uruchamiając sshMakeConfigw jakiejś formie (bezpośrednio, wyszukując mój plik run-config lub uruchamiając nową powłokę)

Knope
źródło