Есть ли способ, чтобы один конфигурационный файл SSH включал другой?

В случае, если это имеет значение:

  • ОС: Ubuntu 10.04
  • SSH: OpenSSH_5.3p1 Debian-3ubuntu5

Я бы хотел, чтобы один конфигурационный файл SSH включал другой. Вариант использования должен заключаться в определении того, что я хочу в моем файле .ssh/config умолчанию, а затем предварительно отложить несколько дополнительных вещей в отдельном файле (например, ~/.ssh/foo.config ). Я хочу, чтобы второй файл был включен первым, поэтому мне не нужно дублировать все в первом. Это выполнимо? Благодаря!

  • Сохранить идентификаторы, добавленные ssh-add, чтобы они сохранялись
  • Как сделать туннель ssh открытым для публики?
  • Может только ssh в Ubuntu 12.04 alpha machine при входе в консоль
  • PubkeyAcceptedKeyTypes и тип ключа ssh-dsa
  • Как определить порт, выделенный на сервере для динамически связанного обратного туннеля openssh?
  • Генерация ключей для SSH
  • Как git клонировать частные репозитории в Vagrant VM, используя ключи SSH хоста?
  • Разрешения ssh и home directory
  • Vim и мышь с ssh от Mac до Linux
  • Как я могу разрешить ошибку «невозможно выполнить двоичный файл»?
  • Могу ли я создать пользователя SSH, который может получить доступ только к определенному каталогу?
  • Как запустить командный файл в PuTTY с помощью автоматического входа в командной строке?
  • 10 Solutions collect form web for “Есть ли способ, чтобы один конфигурационный файл SSH включал другой?”

    Из 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. 

    Например, вы могли бы в ~ / .ssh / config :

     Include config.d/home Host github.com HostName github.com User git 

    И в ~ / .ssh / config.d / home :

     Host laptop HostName laptop.lan 

    Из комментариев используйте приведенное ниже, чтобы включить все файлы в каталог config.d :

     Include config.d/* 

    Нет, насколько мне известно, это невозможно.

    Вот ссылки на соответствующие запросы с открытыми запросами / ошибками:

    https://bugzilla.mindrot.org/show_bug.cgi?id=1585

    https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495

    Если вы хотите запустить ssh-клиент, вы можете сделать это в bash:

     #files are .ssh/config and ~/.ssh/foo.config alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)' 

    То вы обычно используете ssh, и в этом порядке будут храниться оба файла.

    Для сервера daemon sshd вы можете сделать то же самое, просто используйте -f вместо -F и запишите это, где вы сразу запустите демон. Вам не нужен псевдоним.

    Вторая возможность в соответствии с /etc/ssh/ssh_config страницей заключается в том, чтобы установить конфигурацию системы в /etc/ssh/ssh_config и пользовательскую в ~/.ssh/config .

    Обновление. По-видимому, есть некоторые проблемы с некоторыми версиями bash и тем, как создаются устройства. (См. http://bugs.alpinelinux.org/issues/1465 )

    Это обходное решение (хотя, на мой взгляд, уродливое):

     mkfifo /tmp/ssh_fifo cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo & ssh -F /tmp/ssh_fifo myserver rm /tmp/ssh_fifo 

    Поэтому, если вы хотите, вы можете создать из него функцию (или скрипт):

     ssh() { tmp_fifo=$(mktemp -u --suffix=_ssh_fifo) mkfifo "$tmp_fifo" cat ~/.ssh/config ~/.ssh/foo.config >"$tmp_fifo" 2>/dev/null & /usr/bin/ssh -F "$tmp_fifo" "$@" rm "$tmp_fifo" } 

    Подобно другому «уродливому» здесь мой однострочный:

     alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh" 

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

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

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

    Ну, я как-то обманываю, чтобы сделать это. В моих файлах bash .profile-ish у меня есть блок, который заменяет различные части моего домашнего каталога при входе в систему, поэтому я просто генерирую новый каждый раз. Пример:

     rm ~/.ssh/config cat ~/conf/myservers.sshconfig >> ~/.ssh/config [ -f ~/conf/workservers.sshconfig ] && cat ~/conf/workservers.sshconfig >> ~/.ssh/config (or something like this:) for i in `ls ~/conf/sshconfigs` ; do cat $i >> ~/.ssh/config done chmod 600 ~/.ssh/config 

    Это также позволяет мне делать такие вещи, как добавление конфигурационных блоков в конфигурационный файл ssh, только если я на хосте A или B, но не на моих домашних системах.

    Теперь я знаю, кто-то схватит, что если вы входите в систему много, это может привести к чрезмерному замедлению, но на практике я никогда не замечал этого. И я уверен, что вы можете поместить это в скрипт и запустить его через cron.

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

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

    Другое решение на основе FUSE (не тестировалось):

    https://github.com/markhellewell/sshconfigfs

    «Вместо того, чтобы продолжать управлять одним большим файлом, […] вместо этого строит конфигурационный« файл »динамически со многих небольших логических фрагментов».

    Я также нашел статью, сделав это через FIFO: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/

    Ни одно из этих решений псевдонимов не работает для git или других программ, кроме ssh .

    Я хлопнул вместе быстро и грязно, но вы можете улучшить его.

    Добавьте это к своему ~/.bashrc

     mkdir -p ~/.ssh/config.d/ [ -e ~/.ssh/config ] && mv ~/.ssh/config ~/.ssh/config.bak.$(date -Ins) cat ~/.ssh/config.d/* > ~/.ssh/config 

    Каждый раз, когда вы начинаете сеанс, он объединяет все файлы в ~/.ssh/config.d . (Строка 3)

    Недостатком этой версии является то, что если вы измените следующий сеанс ~/.ssh/config вы откроете, ваши изменения будут потеряны, поэтому, чтобы предотвратить перемещение существующего файла в файл .bak. (Строка 2) Проблема в том, что через некоторое время у вас будет много файлов .bak.

    Вы можете легко обновить версию SSH на Ubuntu до версии v7.3 (протестировано на Ubuntu Xenial 16.04), установив пакеты из Yakkety:

     echo "deb http://archive.ubuntu.com/ubuntu yakkety main" > /etc/apt/sources.list.d/yakkety.list apt-get update apt-get install -y ssh rm /etc/apt/sources.list.d/yakkety.list apt-get update 

    Проверить версию SSH

     ssh -V OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016 

    Настройка SSH для использования включает в себя каталог ~ / .ssh / config.d

     mkdir ~/.ssh/config.d sed -i '1iInclude config.d/*' ~/.ssh/config 
    Давайте будем гением компьютера.