У нас есть сервер-бастион, который мы используем для подключения к нескольким хостам, а наш .ssh / config вырос до более тысячи строк (у нас есть сотни хостов, к которым мы подключаемся). Это становится немного громоздким, и я хотел бы знать, есть ли способ разбить файл .ssh / config на несколько файлов. В идеале мы должны указать где-нибудь, что другие файлы будут обрабатываться как файл .ssh / config, например:
~/.ssh/config
~/.ssh/config_1
~/.ssh/config_2
~/.ssh/config_3
...
Я прочитал документацию по ssh / config и не вижу, что это возможно. Но, возможно, у кого-то была аналогичная проблема и он нашел решение.
В ~/.ssh/config
file не имеет директивы для включения других файлов, возможно, связанных с SSH-проверкой прав доступа к файлам.
Предложения по этому поводу могут включать сценарий для одновременного отслеживания нескольких изменений либо в системе, либо с помощью крючков регистрации в репозитории. Можно также изучить такие инструменты, как Puppet или Augeas.
Однако, как бы вы ни подходили к этому, вам придется объединять отдельные файлы в единый файл вне файла.
$ cat ~/.ssh/config_* >> ~/.ssh/config
нота: перезаписать: >
против добавить: >>
Обновление за декабрь 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 следующим образом:
ssh -F /path/to/configfile
Кажется, это единственный выход.
Также нет возможности включать один конфиг в другой.
Начиная с ssh 7.3 (выпущен 1 августа 2016 г.), Include
директива доступна.
Включают: Включить указанный файл (ы) конфигурации. Можно указать несколько имен путей, и каждое имя пути может содержать подстановочные знаки glob и подобные оболочке ссылки "~" на домашние каталоги пользователей. Предполагается, что файлы без абсолютных путей находятся в
~/.ssh
. AnInclude
директива может появиться внутриMatch
илиHost
блок для выполнения условного включения.
(Вот ссылка на отчет об устраненной ошибке, который также включает исправление: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24)
Я лично использую эти команды для компиляции конфигурации 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
Надеюсь, это поможет.
Я бы также использовал cat config_* > config
для генерации всего конфига. Но я бы не стал использовать для этого puppet / cfengine и т.д., если их еще нет (кстати: почему бы не использовать систему управления конфигурациями ???).
Я бы сгенерировал пакет (deb, rpm) и поместил его в локальный репозиторий. А в скрипте postinst кошка генерирует ваш config. Возможно, вы также включите локальную папку ... Преимущество в том, что обновления ssh / config активируются ежедневно во время работы cron-apt & Co.
Вы можете использовать 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
.
Я играл с концепцией 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
в той или иной форме (напрямую, используя мою конфигурацию запуска или запуск новой оболочки)