Як отримати HostName з виконуваного сценарію в конфігураційному файлі SSH?


10

Мені часто потрібно ввійти в довільний комп'ютер із певного кластеру (усі машини в кластері однакові). Однак набір доступних машин у кластері часто змінюється, тому у мене є скрипт, який повертає довільне ім’я хоста з кластеру, який є в наявності, і відповідає моїм вимогам (наприклад, в Інтернеті та запуск правильної ОС).

Зауважте також, що я використовую пересилання облікових даних 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

Пов'язане питання про помилку сервера .
Майкл

Відповіді:


6

~/.ssh/config:

Host cluster
    ProxyCommand ~/bin/cluster-connect

~/bin/cluster-connect:

#!/bin/bash
socat stdio tcp:$(get_host):22

Дякую. Це (або netcat $(get_host) 22) чудово підходить для з'єднання. Але це, здається, не передає мої дані kerberos. У мене є GSSAPIAuthentication yesі GSSAPIDelegateCredentials yesпід Host clusterв моєму .ssh/configфайлі, і вони працюють , якщо HostName дається в явній формі , але якщо я маршрут через ProxyCommand. Думки? Я також зміню питання.
Девід Б.

Я не думаю, що ви можете цього досягти - sshтреба знати цільове ім’я хоста, щоб отримати правильний квиток, і просто немає способу його динамічно надати (за винятком використання обгортки, яка просто працює ssh $(get_host) "$@", чого, як я зрозумів, ви не хочете ). Це може спрацювати, якщо всі сервери в кластері мають однакову основу Kerberos, але я не думаю, що хтось так робить.
grawity

Невдало, але робить сенс. Я написав швидку обгортку, щоб зробити динамічну пошук / заміну (додано до питання). У деяких сценаріях вона зламається, але працює для мене.
Девід Б.

Динамічна знахідка / заміна? ...
grawity

Просто sed заміщення аргументів командного рядка на ssh, від хоста-alise до відображення-сценарію хост-покоління, що зберігається в сценарії.
Девід Б.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.