Вопрос или проблема
У меня есть три машины:
remote.example.org
— цель, к которой я пытаюсь подключитьсяbastion.example.org
, который является единственными “воротами” к этой машине, но его нельзя использовать в качестве прокси, как в SSH proxyjumpjump.example.org
, к которому мне нужно получить доступ для соединения с bastion.example.org
Поскольку bastion использует имя пользователя для доступа к удаленному серверу, я не могу использовать его в качестве обычного сервера proxyjump. На данный момент, если я хочу подключиться к удаленной цели с сервера jump, мне нужно ввести следующее:
ssh -l [email protected]:daftaupe bastion.example.org
Теперь у меня есть рабочая команда из моего рабочего места, это лучше, чем ничего:
ssh -l [email protected]:daftaupe -o ProxyCommand="ssh -W %h:%p jump.example.org" bastion.example.org
Я хотел бы поместить это в свой .ssh/config
. С одним сервером нет проблем, и следующий фрагмент позволяет мне просто вводить ssh remote.example.org
.
Host bastion.example.org
ProxyJump jump.example.org
Host remote.example.org
Hostname bastion.example.org
User daftaupe:remote.example.org@daftaupe
Моя проблема в том, что у меня есть несколько сотен таких серверов, и они постоянно меняются, поэтому не так легко вести их список.
Я пытался использовать следующее, но, похоже, невозможно использовать %n
в директиве User.
Host bastion.example.org
ProxyJump jump.example.org
Host remote.example.org
Hostname bastion.example.org
User daftaupe:%n@daftaupe #???
Я ищу способ, чтобы переменная User
не была статической. Но я не вижу, как извлечь имя пользователя из исходного удаленного имени, указанного в командной строке, используя, например, TOKEN %n
из мануала по ssh_config
, что кажется подходящим для моего случая.
Я начал писать небольшую оболочку вокруг ssh, но предпочел бы оставить все в конфигурации SSH.
Ответ или решение
Чтобы решить вашу проблему с подключением к нескольким удалённым серверам через "бастион" с использованием SSH, мы можем воспользоваться конфигурацией SSH и некоторыми её возможностями. Однако, как вы правильно заметили, параметр User
не поддерживает замену на основе имени хоста через %n
в конфигурационных файлах SSH. Вместо этого мы можем использовать другие подходы.
Прямое решение с использованием SSH конфигурации
В вашем случае, когда у вас есть динамически изменяющиеся имена пользователей, более эффективным решением может быть использование ProxyCommand
для выполнения необходимой логики на более низком уровне.
Создайте обертку вокруг ssh
, которая будет извлекать имя пользователя из имени удаленного хоста и затем выполнять конечную команду SSH. Однако, если вы хотите оставить всё конфигурирование в ~/.ssh/config
, следующее предложение может оказаться полезным.
Пример конфигурации
Вместо использования %n
, вы можете создать два отдельных хоста в вашем ~/.ssh/config
, с помощью которых будет осуществляться аутентификация, как в следующем образце:
# Настройки для вашего нагруженного сервера
Host bastion
HostName bastion.example.org
User daftaupe
ProxyJump jump.example.org
# Настройки для удаленного сервера
Host remote-*
HostName bastion.example.org
User %h@daftaupe
Объяснение
-
Настройка
bastion
: В этом разделе мы указываем, что для доступа к серверуbastion.example.org
мы используем имя пользователяdaftaupe
, и добавляемProxyJump
для подключения черезjump.example.org
. -
*Настройка `remote-
:** Этот блок будет соответствовать любому названию, начинающемуся с
remote-, что позволяет вам указать удаленные сервера, которые вы хотите использовать. В данном случае мы используем
%h`, которое соответствует имени хоста, которое использовано в команде SSH.
Таким образом, если вы выполните команду:
ssh remote.example.org
то SSH будет использовать bastion.example.org
с пользователем remote.example.org@daftaupe
.
Альтернативный подход
Если структура ваших данных имеет возможность регулировать формат имени удалённого хоста заранее, вы можете создать более разнообразный шаблон именования, который позволил бы легко извлекать нужные вам данные.
Использование скрипта-обертки
Вот простой пример скрипта на Bash, который может выполнять эти шаги:
#!/bin/bash
# Извлечь имя пользователя из аргумента
username=$(echo $1 | cut -d'.' -f1)
# Выполнить SSH команду
ssh -l ${username}@daftaupe -o ProxyCommand="ssh -W %h:%p jump.example.org" bastion.example.org
Сохраните этот скрипт, например под названием ssh-wrapper
, сделайте его исполняемым (chmod +x ssh-wrapper
), и вы сможете вызывать его так:
./ssh-wrapper remote.example.org
Заключение
Эти подходы обеспечивают большую гибкость при работе с удалёнными серверами через SSH. Важно отметить, что использование конфигурационного файла SSH должно быть адаптировано в соответствии с вашими потребностями и специфическими требованиями доступа.