Мне часто нужно подключиться по ssh к произвольному компьютеру из определенного кластера (все машины в кластере идентичны). Однако набор доступных компьютеров в кластере часто меняется, поэтому у меня есть сценарий, который возвращает произвольное имя хоста из кластера, которое доступно и соответствует моим требованиям (например, в сети и под управлением правильной ОС).
Также обратите внимание, что для аутентификации я использую переадресацию учетных данных Kerberos (GSSAPIAuthentication).
Прямо сейчас я использую ssh `get_host` .  Я хотел бы вместо этого выполнить ssh cluster .  С известным именем хоста это легко сделать с помощью следующего в /ssh/config:
Host cluster
    HostName static_host.cluster.domain.tld
    GSSAPIAuthentication yes
    GSSAPIDelegateCredentials yes
Как я могу выбрать HostName динамически, используя мой скрипт? (Или у SSH есть другой метод для поддержки желаемой функции?) Я хотел бы сделать что-то вроде следующего, но это не работает:
Host cluster
    HostName `get_host`   # This does not work
    ...
Гравити показал, что ProxyCommand может быть скриптом, который получает имя хоста и передает ему ssh соединение, используя netcat или socat .  Однако это не пересылает учетные данные Kerberos.  Помощь в этом также приветствуется.
РЕДАКТИРОВАТЬ:
Вы не можете сделать это с Kerberos, как я хотел бы (см. Комментарии в принятом ответе).  Итак, я использую этот сценарий ssh-wrapper в качестве псевдонима ssh для динамического переписывания аргумента командной строки ssh .  Это не надежно, но это работает для меня.
#!/bin/bash
# Mapping between host aliases and dynamically-generated hostname
declare -A MAP
MAP[cluster]=`gethost`
# Find and replace on all positional args
args=$*
for key in ${!MAP[@]}; do
    replace=${MAP[$key]}
    args=`echo ${args} | sed "s/\(^\|[[:space:]]\)${key}\(\$\|[[:space:]]\)/${replace}/"`
done
# Execute using called-name if not this script
if [ "ssh-wrapper" != "`basename $0`" ]; then
    exec $0 ${args}
# Otherwise, assume ssh and execute
else
    exec ssh ${args}
fi
 