Вопрос или проблема
У меня есть сервер, на котором запущены несколько “SSH-демонов” (фактически Stash и OpenSSH), для каждого из которых необходимы разные SSH-ключи. Эти демоны прослушивают 2 разных порта.
В конфигурации SSH на клиентских машинах (конкретно в ~/.ssh/config
) возможно ли указать порт в директиве Host
/Match
(или каким-то другим способом), чтобы я мог переопределять IdentityFile
в зависимости от порта? Таким образом, ssh myserver -p 22
и ssh myserver -p 23
оба будут входить, используя правильные ключи, без дополнительной конфигурации.
Вы можете использовать ключевое слово Match
в конфигурационном файле для того, чтобы иметь условную конфигурацию в зависимости от целевого порта.
Match host somehost exec "test %p = 42"
IdentityFile ...
Приведенный выше пример применит строку “IdentityFile” только в том случае, если целевой хост – “somehost” и целевой порт – 42. Match
работает так же, как Host
, в том смысле, что строки, следующие за ним (до следующей строки Match или Host), применяются только к сессиям, которые соответствуют критериям. В примере строка Match проверяет, что хост – “somehost”, и также выполняет внешнюю команду, которая считается соответствующей, если команда завершилась с кодом 0.
Команда, выполняемая здесь, – test %p = 42
. “%p” будет заменен на значение порта, которое ssh использует до этого момента (либо значение по умолчанию 22, либо значение из командной строки). test
также известен как [
; это утилита командной строки, в основном используемая в оболочках как часть оператора if
. Здесь test
используется для проверки, является ли номер порта 42.
Ключевое слово Match
было добавлено в OpenSSH в версии 6.5 или 6.6. Проверьте вашу страницу man для ssh_config
, чтобы узнать, доступно ли оно на вашей системе.
Вы можете создать “псевдонимы” хостов в вашем файле ~/.ssh/config
, которые будут ссылаться на SSH-демоны на разных портах одного и того же сервера. Например:
Host daemon1
HostName host.domain.com
Port 22
IdentityFile ~/.ssh/id_rsa_daemon1
Host daemon2
HostName host.domain.com
Port 23
IdentityFile ~/.ssh/id_rsa_daemon2
Тогда вы сможете выполнить ssh daemon1
или ssh daemon2
, чтобы войти в конкретный SSH-демон.
Ответ или решение
Конфигурация SSH: сопоставление хоста и порта
При работе с серверами, на которых запущены несколько SSH-демонов на разных портах, важно правильно настроить клиентскую конфигурацию SSH. Это позволит вам использовать нужные ключи для каждого демона без дополнительных манипуляций. В данной статье мы рассмотрим, как можно настроить файл конфигурации SSH для работы с демонами, используя директивы Host
и Match
.
Основы конфигурации SSH
SSH-клиент использует файл конфигурации, находящийся в директории ~/.ssh/config
, для настройки параметров подключения. В этом файле вы можете указать специфические настройки для отдельных хостов, включая имя хоста, порт и файл идентификации (ключ). Пример конфигурации для двух демонов, работающих на портах 22 и 23, может выглядеть следующим образом:
Host daemon1
HostName host.domain.com
Port 22
IdentityFile ~/.ssh/id_rsa_daemon1
Host daemon2
HostName host.domain.com
Port 23
IdentityFile ~/.ssh/id_rsa_daemon2
Теперь для подключения к каждому демону достаточно ввести команды ssh daemon1
или ssh daemon2
.
Использование директивы Match
Однако если вы хотите использовать одно имя хоста с различными портами и при этом задать разные файлы ключей, вы можете воспользоваться директивой Match
. Этот подход позволяет создавать более гибкие условия для настройки. Пример использования может выглядеть следующим образом:
Host myserver
HostName host.domain.com
Match host myserver exec "test %p = 22"
IdentityFile ~/.ssh/id_rsa_daemon1
Match host myserver exec "test %p = 23"
IdentityFile ~/.ssh/id_rsa_daemon2
В данном случае директива Match
проверяет, какой порт используется при подключении к myserver
, и в зависимости от этого применяет соответствующий файл ключа. Команда test %p
возвращает 0 (успех), если порт соответствует указанному значению.
Совместимость с версиями SSH
Обратите внимание, что директива Match
была добавлена в OpenSSH начиная с версии 6.5 или 6.6. Перед использованием этой функции обязательно проверьте вашу версию OpenSSH с помощью команды ssh -V
и документации (man ssh_config
).
Резюме
Корректная настройка вашего SSH-клиента с использованием директив Host
и Match
позволяет значительно упростить процесс подключения к серверам с несколькими SSH-демонами. Вы сможете логироваться в каждый демон, используя правильные ключи, просто запуская одну и ту же команду с разными портами.
Эта конфигурация не только увеличивает удобство работы с сервером, но и обеспечивает безопасность за счет использования уникальных ключей для каждого демона. Следуя этим рекомендациям, вы сможете оптимизировать свою работу и снизить риск ошибок при подключении к различным сервисам.