Мне часто нужно подключиться по ssh к произвольному компьютеру из определенного кластера (все машины в кластере идентичны). Однако набор доступных компьютеров в кластере часто меняется, поэтому у меня есть сценарий, который возвращает произвольное имя хоста из кластера, которое доступно и соответствует моим требованиям (например, в сети и под управлением правильной ОС).
Также обратите внимание, что для аутентификации я использую переадресацию учетных данных Kerberos (GSSAPIAuthentication).
Прямо сейчас я использую ssh 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
Ответы:
~/.ssh/config
:~/bin/cluster-connect
:источник
netcat $(get_host) 22
) прекрасно работает для связи. Но, похоже, он не проходит мои полномочия Kerberos. У меня естьGSSAPIAuthentication yes
иGSSAPIDelegateCredentials yes
подHost cluster
в моем.ssh/config
файле, и они работают , если HostName дается в явной форме , но если я маршрут через ProxyCommand. Мысли? Я тоже исправлю вопрос.ssh
должны знать целевое имя хоста, чтобы получить правильный билет, и просто нет способа предоставить его динамически (если не использовать обертку, которая просто запускаетсяssh $(get_host) "$@"
, что, как я понял, вам не нужно ). Это может сработать, если все серверы в кластере имеют один и тот же принцип Kerberos, но я не думаю, что кто-то когда-либо это делает.