119

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

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

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

12 ответов12

120

Начиная с версии 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/* 
28

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

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

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

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

24

Если вы хотите запустить 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"
}
16

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

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

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

14

Так же, как и другие «некрасивые», вот моя строчка:

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

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

3

Другое решение на основе FUSE (сам не проверял):

https://github.com/markhellewell/sshconfigfs

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

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

3

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

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

2

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

1

Вы можете легко обновить версию 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 для использования include из каталога ~/.ssh/config.d

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config
0

Мой тупой ответ:

  • Попытался установить OpenSSH> 7.3 на Xenial (16.04)
  • Не понравился беспорядок, который это сделало

Поэтому я согласился на это:

  • Сохраните ваши отдельные файлы конфигурации OpenSSH в ~/.ssh/config.d/
  • Когда вы меняете его, делайте cat ~/.ssh/config.d/* > ~/.ssh/config
  • В славный день вы обновляете до версии с дистрибутивом OpenSSH 7.3p1 или новее, вместо этого вы можете создать файл, содержащий

Include config.d/*

0

Я не могу обновить SSH на моей машине.

Я использовал GNU make для генерации конфигурационного файла ssh только при необходимости:

# Concatenates all the .config files.
aInput  = *.config
aOutput = ~/.ssh/config

aCurrentMakefile = $(lastword $(MAKEFILE_LIST))

$(aOutput): $(shell ls $(aInput)) $(aCurrentMakefile)
    @echo "Generating $(aOutput)"
    @echo "# File generated by $(aCurrentMakefile) on $(shell date +'%F %T.%6N')" > $(aOutput)
    @cat $(aInput) >> $(aOutput)

Затем SSH связывается с

alias ssh='make -s -f ~/Tools/config.d/makefile -C ~/Tools/config.d && ssh'

Отлично работает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .