Вы можете иметь более одного файла ~ / .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 для прав доступа к файлам.

Предложения по этому вопросу могут включать сценарий для отслеживания нескольких изменений в системе либо через зацепки в хранилище. Можно также изучить такие инструменты, как 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.
Джефф Ферланд
источник
Спасибо, Джефф, это хорошая идея. Я не знаю слишком много о Puppet или Augeas, поэтому для простоты, насколько это возможно, ваше решение кажется лучшим. Я мог бы разбить конфигурацию на несколько конфигов и создать простой скрипт для воссоздания файла .ssh / config при каждом изменении одного из файлов. Я не знаю, насколько это чистое решение, но, похоже, оно работает и работает для моих целей.
спорщик
52

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

ssh -F /path/to/configfile

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

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

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

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

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

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

Кристиан Гудон
источник
2
Это слишком круто. С нетерпением ждем этого. Это должно наконец решить эту проблему правильным способом :)
спорщик
2
Просто добавьте директиву Include в верхней части 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

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

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

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

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

ThorstenS
источник
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.

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

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

knope
источник