Ви можете мати більше ~ / .ssh / config-файлу?


82

У нас є сервер бастіонів, який ми використовуємо для підключення до декількох хостів, а наш .ssh / config виріс до понад тисячі ліній (у нас є сотні хостів, до яких ми підключаємося). Це починає бути трохи непростим, і я хотів би знати, чи є спосіб розбити .ssh / config файл на кілька файлів. В ідеалі ми десь вказали, що інші файли будуть розглядатися як .ssh / config файл, можливо, як:

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

Я прочитав документацію на ssh / config і не бачу, що це можливо. Але, можливо, хтось інший мав подібне питання і знайшов рішення.


Попросіть кожного користувача увійти в хост бастіону зі своїм власним іменем користувача. Крім того, що ви вводите у конфігураційний файл, який вимагає запису для кожного хоста? Ви не можете встановити загальні параметри за замовчуванням?
Джед Даніельс

1
Те саме питання на superuser.com: superuser.com/questions/247564/…
guettli

1
Незабаром у OpenSSH 7.3 це повинно бути можливим. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

Відповіді:


51

Цей ~/.ssh/configфайл не містить директиви щодо включення інших файлів, можливо, пов'язаних із перевіркою SSH на наявність дозволів на файл.

Пропозиції навколо цього можуть включати в себе сценарій, щоб провести кілька змін разом або в системі, або через гачки перевірки в сховищі. Можна також вивчити такі інструменти, як Лялька чи Аггеї.

Однак, якщо ви підходите до нього, вам доведеться поєднувати окремі файли, щоб бути єдиним файлом поза його файлом.

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

Примітка: перезапис: > vs додати:>>

Оновити грудень 2017 року:

З 7.3p1 і вище існує опція Включити. Що дозволяє включати файли конфігурації.

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.

Дякую Джеффу, це гарна ідея. Я не знаю надто багато про Лялечку чи Аггеїв, тому задля того, щоб зробити речі максимально простими, ваше рішення здається найкращим. Я міг би розбити конфігурацію на кілька конфігурацій і створити простий скрипт, щоб відтворити .ssh / config файл кожного разу, коли один з файлів буде змінено. Я не знаю, наскільки це чисте рішення, але, здається, це зробити трюк і працює для моїх цілей.
суперечка

52

Ви можете вказати поточний конфігураційний файл, який буде використовуватись у такому варіанті ssh:

ssh -F /path/to/configfile

Здається, це єдиний спосіб.

Також немає можливості включати один конфігурацію в інший.


Приємно мати варіант при використанні Perl's Net :: OpenSSH модуля (наприклад, для декількох файлів із приватними ключами.), Де модуль не дає всіх можливостей.
Джиммі Кертінг

36

Починаючи з ssh 7.3 (вийшов 1 серпня 2016 року), Includeдоступна директива.

Включити : включити вказані файли конфігурації. Можна вказати кілька імен шляхів, і кожне ім'я контуру може містити глобальні підмітні знаки та схожі на оболонки "~" посилання на домашні каталоги користувачів. Файли без абсолютних шляхів вважаються такими, що є ~/.ssh. IncludeДиректива може з'являтися всередині Matchабо Hostблок для виконання умовного включення.

(Ось посилання на вирішений звіт про помилку, який також включає патч: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )


2
Це занадто круто. Чекайте цього. Це нарешті має вирішити цю проблему правильним шляхом :)
wrangler

2
Просто додайте директиву Включити у верхній частині configфайлу. Я не можу зрозуміти, чому це не працює внизу.
піловер

17

Я особисто використовую ці команди, щоб скласти 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.)

або:

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)

оскільки:

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

не працює для мене, повертаючись:

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

Сподіваюсь, це допоможе вам.


ssh -F <(cat .ssh/*.config)було б ідеально. Я теж придумав це, але я отримую ту ж помилку. Хтось знає, у чому тут проблема?
хворобливість

2
ssh перевіряє дозволи на файли, я думаю, що такий тип перенаправлення не підтримує цю перевірку.
Камден Нарц

2

Я також використовував би cat config_* > configдля створення цілого конфігурації. Але я б не використовував для цього ляльковий / cfengine тощо, якщо вони ще не встановлені (BTW: чому б не використовувати систему управління конфігурацією ???).

Я б генерував пакунок (deb, rpm) і помістив його у локальне сховище. І в сценарії Postinst кішка генерує вашу конфігурацію. Можливо, ви також включаєте локальну папку ... Перевага полягає в тому, що оновлення ssh / config активуються щодня під час запуску cron-apt & Co.


0

Ви можете використовувати Makefile у ~/.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

Потім перемістіть існуючу configв config.inі запустити makeдля генерації config.


0

Я грав із концепцією config.dкаталогу для організації конфігурації. Отже, щоб додати до вищевказаної купи опцій, ось що для мене працює.

Структура каталогів щось подібне

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

Функція, яка будує ~ / .ssh / config і живе в run-config моєї оболонки, полягає в наступному

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
}

Необов’язково додайте sshMakeConfigв нижню частину запуску-конфігурації, якщо ви хочете забезпечити свіжу конфігурацію на кожному сеансі оболонки

Кожен раз, коли мені потрібно перекомпілювати ~ / .ssh / config, я роблю це, запустивши sshMakeConfigв якійсь формі (безпосередньо, джерело мого запуску-конфігурації або запуск нової оболонки)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.