Вопрос: У вас может быть более одного файла ~ / .ssh / config?


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

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

Я прочитал документацию по ssh / config, и я не вижу, что это возможно. Но, возможно, у кого-то была аналогичная проблема, и он нашел решение.


57
2018-03-31 17:47


Источник


Попросите каждого пользователя войти на хост bastion со своим собственным именем пользователя. Кроме того, что вы вкладываете в конфигурационный файл, который требует записи для каждого хоста? Не можете ли вы установить некоторые стандартные значения по умолчанию? - Jed Daniels
Тот же вопрос на superuser.com: superuser.com/questions/247564/... - guettli
Вскоре в OpenSSH 7.3 это должно быть возможно. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25 - azmeuk


Ответы:


~/.ssh/config файл не имеет директивы для включения других файлов, возможно, связанных с проверкой SSH на права доступа к файлам.

Предложения по этому поводу могут включать скрипт для совместного использования нескольких изменений в системе или через контрольные крючки в репозитории. Можно также взглянуть на такие инструменты, как кукольный или авгейский.

Однако вы подходите к нему, однако вам придется объединить отдельные файлы в один файл из-за пределов файла.

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

заметка:  перезапись: >  смотри выше добавить: >>

Обновление в декабре 2017 года:

Из 7.3p1 и выше есть опция Include. Это позволяет включать файлы конфигурации.

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.

35
2018-03-31 18:01



Спасибо Джеффу, это хорошая идея. Я не слишком много знаю о Puppet или Augeas, поэтому, чтобы сохранить как можно более простые вещи, ваше решение кажется лучшим. Я могу разбить конфигурацию на несколько конфигураций и создать простой скрипт для воссоздания файла .ssh / config при каждом изменении одного из файлов. Я не знаю, насколько это чистое решение, но похоже, что он делает трюк и работает для моих целей. - remotehost


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

ssh -F /path/to/configfile

Кажется, это единственный способ.

Также теперь нужно включить один конфиг в другой.


34
2018-03-31 18:06



Приятно иметь опцию при использовании Perl Net :: OpenSSH Module (например, для нескольких файлов с закрытыми ключами), где модуль не дает всех возможностей. - Jimmy Koerting


Начиная с ssh 7.3 (выпущенный 1 августа 2016 года), Include директива доступна.

Включают: Включить указанный файл (ы) конфигурации. Несколько путей   имена могут быть указаны, и каждое имя пути может содержать glob   подстановочные знаки и похожие на оболочку «~» ссылки на домашние каталоги пользователей.   Предполагается, что файлы без абсолютных путей находятся в ~/.ssh,    Include может появиться внутри Match или Host блокировать   выполнить условное включение.

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


27
2017-07-11 15:19



Это слишком круто. Посмотрите вперед к этому. Он должен окончательно решить эту проблему правильно: - remotehost


Я лично использую эти команды для компиляции конфигурации 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

Надеюсь, это поможет.


16
2017-11-27 15:07



ssh -F <(cat .ssh/*.config) было бы идеальным. Я тоже придумал это, но у меня такая же ошибка. Кто-нибудь знает, в чем проблема? - sickill
ssh проверяет права доступа к файлам, я думаю, что этот вид перенаправления не поддерживает эту проверку. - Camden Narzt


Я также буду использовать cat config_* > config для создания всей конфигурации. Но я бы не использовал для этого кукольный / cfengine и т. Д., Если они еще не созданы (BTW: почему бы не использовать систему управления конфигурацией ???).

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


2
2018-03-31 19:34





Вы можете использовать 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
2018-05-04 22:18





Я играю с концепцией 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 в нижней части вашего run-config, если вы хотите обеспечить новую конфигурацию на каждом сеансе оболочки

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


0
2018-03-16 12:59