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


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

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

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


109
2018-02-18 17:45


Источник


Тот же вопрос на serverfault: serverfault.com/questions/375525/... - guettli


Ответы:


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

Include

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

Например, вы могли бы иметь ~/.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/* 

93
2017-11-05 20:12



проверить версию с помощью $ ssh -V - Pieter
использование Include config.d/* включить все записи в config.d, - Simon Woodside
Ftr: это должно быть в верхней части файла и не может просто быть добавлено в список Host записей. - dtk
пробовал Ubuntu 16.04. Хотя, это работает, но автозаполнение разбито что делает его менее полезным. Если вы хотите обновить ssh на ubuntu, проверьте эту ссылку gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677 - cwhsu


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

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

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

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


28
2018-02-18 17:54



Также эта ошибка в Debian: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189 - Lluís
О, МОЙ БОГ. Это происходит. С 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3 - oschrenk


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

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

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

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

Вторая возможность в соответствии с справочной страницей состоит в том, чтобы установить систему в /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"
}

24
2018-04-19 10:51



К сожалению, это не работает в OSX ssh: Не удается открыть файл конфигурации пользователя / dev / fd / 63: Неверный дескриптор файла - Ash Berlin-Taylor
Это также не работает для меня (Ubuntu 11.10), Linux дает ту же ошибку, что и @AshBerlin, выше. - Szymon Jeż
@AshBerlin вы тоже можете попробовать, это должно работать и для OSX, пока ошибка не будет исправлена - estani
Учитывая, что ssh проверяет три места, 1. командную строку, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, вам не нужно проходить ~/.ssh/config в командной строке. Просто alias ssh='ssh -F ~/.ssh/foo.config' а также ~/.ssh/config следует получить после этого. Пока вы не возражаете foo.config сначала загружается, что должно быть чище, чем описанное выше решение. - jim
@jim нет, он не работает так. Используется первый найденный. Ты это пробовал? с man-страницы "-F configfile: определяет альтернатива для каждого пользователя. Если в командной строке указан конфигурационный файл, системный файл конфигурации (/ etc / ssh / ssh_config) будет проигнорирован. " - estani


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

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

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


15
2017-07-11 15:22





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

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

14
2018-02-21 09:02



Обратите внимание, что sftp команда не приведет к перерасчету конфигурации. - VasyaNovikov
(Мне все еще нравится ответ, потому что он использует «config.d /» и очень прост.) - VasyaNovikov
простой, элегантный, но хакерский - code_monk


Ну, я как-то обманываю, чтобы сделать это. В моих файлах 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.


6
2017-11-20 19:26





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

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


3
2017-11-27 15:14



Вы можете пойти дальше и объединить это с fswatch, для автоматической компиляции при смене файла - cavalcade


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

https://github.com/markhellewell/sshconfigfs

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

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


3
2018-06-10 17:54



Мне кажется, это чуть больше, чем ссылка на внешний сайт следовательно, может быть удален. (Потому что ссылки могут «умереть», и, по крайней мере, полезно суммировать контент из других источников, чтобы люди не были обязаны посещать другой сайт для каких-либо подробностей.) - pnuts
Я считаю, что содержание комментариев достаточно наглядное, - говорит «FUSE» (возможно, расширение аббревиатуры было бы лучше); Ссылка предназначена только для реализации. - aviv
FUSE, @aviv Ну, ответ еще не удален, поэтому, надеюсь, никакого вреда! - pnuts
Не знал о проблемах с короткими ответами, ответ расширен. Похоже, мне придется время от времени проверять сайт для моих ответов, в отсутствие уведомлений по электронной почте :) Учиться использовать favs, к настоящему времени. Спасибо за комментарии. - amontero


Ни одно из этих решений псевдонимов не работает 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.


2
2018-05-19 09:45



Отлично с добавлением некоторых is_anything_changed состояние - vp_arth


Вы можете легко обновить версию 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

1
2018-03-21 13:57