Ho spesso bisogno di accedere a un computer arbitrario da un determinato cluster (tutte le macchine nel cluster sono identiche). Tuttavia, il set di macchine disponibili nel cluster cambia frequentemente, quindi ho uno script che restituisce un nome host arbitrario dal cluster che è disponibile e soddisfa i miei requisiti (ad esempio, online e con il sistema operativo corretto).
Si noti inoltre che sto utilizzando l'inoltro delle credenziali Kerberos (GSSAPIAuthentication) per l'autenticazione.
In questo momento, ho usato SSH ssh `get_host`. Vorrei invece eseguire ssh cluster. Con un nome host noto, questo è facile con quanto segue in /ssh/config:
Host cluster
HostName static_host.cluster.domain.tld
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
Come posso selezionare HostNamedinamicamente, usando il mio script? (O SSH ha un metodo diverso per supportare la mia funzione desiderata?) Vorrei fare qualcosa di simile al seguente, ma non funziona:
Host cluster
HostName `get_host` # This does not work
...
Grawity ha mostrato che ProxyCommandpuò essere uno script che ottiene il nome host e inoltra la sshconnessione ad esso usando netcato socat. Tuttavia, questo non sta inoltrando le credenziali Kerberos. Anche l'aiuto con questo è apprezzato.
MODIFICARE:
Non puoi farlo con Kerberos come vorrei (vedi commenti nella risposta accettata). Quindi, sto usando questo script, ssh-wrappercome sshalias per fare riscrittura dinamica sshsull'argomento della riga di comando. Non è robusto, ma funziona per me.
#!/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