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