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
Odpowiedzi:
~/.ssh/config
:~/bin/cluster-connect
:źródło
netcat $(get_host) 22
) działa świetnie dla połączenia. Ale wydaje się, że nie przechodzi przez moje dane uwierzytelniające Kerberos. MamGSSAPIAuthentication yes
iGSSAPIDelegateCredentials yes
poniżejHost cluster
w moim.ssh/config
pliku, i działają one, jeśli nazwa hosta jest zrozumiała, ale nie, jeśli trasy przez ProxyCommand. Myśli? Zmienię również pytanie.ssh
musisz znać docelową nazwę hosta, aby uzyskać prawidłowy bilet, i po prostu nie ma sposobu, aby zapewnić go dynamicznie (bez użycia opakowania, które po prostu działassh $(get_host) "$@"
, co, jak zrozumiałem, nie chcesz ). To może działać, jeśli wszystkie serwery w klastrze mają taką samą Kerberos kapitał, ale nie sądzę, ktoś kiedykolwiek robi.