Мені часто потрібно ввійти в довільний комп'ютер із певного кластеру (усі машини в кластері однакові). Однак набір доступних машин у кластері часто змінюється, тому у мене є скрипт, який повертає довільне ім’я хоста з кластеру, який є в наявності, і відповідає моїм вимогам (наприклад, в Інтернеті та запуск правильної ОС).
Зауважте також, що я використовую пересилання облікових даних 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
...
Grawity показав, що ProxyCommandможе бути сценарієм, який отримує ім'я хоста і передає sshз'єднання з ним за допомогою netcatабо socat. Однак це не пересилає облікові дані 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