У меня есть куча не совсем новых компьютеров, которые я подключил к небольшому вычислительному кластеру, потому что почему бы и нет. У меня есть один главный узел с публичным IP-адресом, с которым все эти компьютеры могут общаться. Рабочие узлы находятся за NAT. Поэтому, чтобы общаться со всеми ними, я заставляю их всех создавать обратный туннель SSH в главный узел при загрузке. Таким образом, каждый из них подключается к главному узлу через свой порт. Каждая машина выбирает порт, n+1
где n
— номер порта предыдущей машины. В моей конфигурации SSH на ноутбуке есть следующее:
Host worker*
ProxyCommand ssh master -W %h:%p
HostName localhost
Host worker001
Port 7001
Host worker002
Port 7002
....
#Host workerX
# Port 7000 + X
Что я хотел бы сделать, так это иметь одну запись для моих работников, так что workerX использует порт 7000 + X. Возможно ли это с конфигурацией ssh? Если нет, есть ли какой-то другой обходной путь, чтобы это произошло? В качестве альтернативы, могу ли я "разделить" мою конфигурацию ssh, так что мой ~/.ssh/config
файл не будет содержать сотни строк workerX
, и я смогу ограничить весь этот беспорядок?
решение1
Вы используете ProxyCommand, поэтому просто напишите специальную команду, которая делает следующее:
ProxyCommand ~/bin/worker-ssh %h
Сам сценарий может выглядеть примерно так:
#!/usr/bin/env bash
host=$1
if [[ $host =~ ^worker0*([0-9]+)$ ]]; then
port=${BASH_REMATCH[1]}
port=$(( port + 7000 ))
ssh master -W "localhost:$port"
else
echo "error: $0: host '$host' is not a worker" >&2
exit 1
fi
(Не используйте его HostName
вместе с этим; команде proxy, очевидно, потребуется знать исходное имя хоста.)