Często muszę ssh do dowolnego komputera z określonego klastra (wszystkie komputery w klastrze są identyczne). Jednak zestaw dostępnych komputerów w klastrze często się zmienia, więc mam skrypt, który zwraca dowolną nazwę hosta z klastra, który jest dostępny i odpowiada moim wymaganiom (np. Online i działający prawidłowy system operacyjny).
Zauważ też, że używam przekazywania uwierzytelnienia Kerberos (GSSAPIAuthentication) do uwierzytelnienia.
W tej chwili używam ssh ssh `get_host`. Chciałbym zamiast tego wykonać ssh cluster. W przypadku znanej nazwy hosta jest to łatwe dzięki /ssh/config:
Host cluster
HostName static_host.cluster.domain.tld
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
Jak mogę wybrać HostNamedynamicznie, używając mojego skryptu? (Lub czy SSH ma inną metodę do obsługi mojej pożądanej funkcji?) Chciałbym zrobić coś takiego, ale to nie działa:
Host cluster
HostName `get_host` # This does not work
...
Grawity pokazał, że ProxyCommandmoże to być skrypt, który pobiera nazwę hosta i przekazuje sshpołączenie do niego za pomocą netcatlub socat. Nie oznacza to jednak przekazywania poświadczeń Kerberos. Doceniana jest również pomoc w tym zakresie.
EDYTOWAĆ:
Nie możesz tego zrobić z Kerberos, tak jak chciałbym (patrz komentarze w zaakceptowanej odpowiedzi). Tak więc używam tego skryptu ssh-wrapperjako sshaliasu do dynamicznego przepisywania przy użyciu sshargumentu wiersza poleceń. Nie jest solidny, ale działa dla mnie.
#!/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