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ć HostName
dynamicznie, 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 ProxyCommand
może to być skrypt, który pobiera nazwę hosta i przekazuje ssh
połączenie do niego za pomocą netcat
lub 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-wrapper
jako ssh
aliasu do dynamicznego przepisywania przy użyciu ssh
argumentu 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