Con frecuencia necesito ingresar a una computadora arbitraria desde un clúster particular (todas las máquinas en el clúster son idénticas). Sin embargo, el conjunto de máquinas disponibles en el clúster cambia con frecuencia, por lo que tengo un script que devuelve un nombre de host arbitrario del clúster que está disponible y cumple con mis requisitos (por ejemplo, en línea y con el sistema operativo correcto).
Tenga en cuenta también que estoy usando el reenvío de credenciales Kerberos (GSSAPIAuthentication) para la autenticación.
En este momento, estoy usando ssh `get_host`
. Me gustaría ejecutar en su lugar ssh cluster
. Con un nombre de host conocido, esto es fácil con lo siguiente en /ssh/config
:
Host cluster
HostName static_host.cluster.domain.tld
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
¿Cómo puedo seleccionar HostName
dinámicamente, usando mi script? (¿O SSH tiene un método diferente para admitir mi función deseada?) Me gustaría hacer algo como lo siguiente, pero no funciona:
Host cluster
HostName `get_host` # This does not work
...
Grawity demostró que ProxyCommand
puede ser un script que obtiene el nombre de host y reenvía la ssh
conexión con netcat
o socat
. Sin embargo, esto no reenvía las credenciales de Kerberos. Ayuda con esto también es apreciada.
EDITAR:
No puede hacer esto con Kerberos como me gustaría (vea los comentarios en la respuesta aceptada). Entonces, estoy usando este script, ssh-wrapper
como un ssh
alias para hacer una reescritura dinámica en el ssh
argumento de la línea de comandos. No es robusto, pero funciona para mí.
#!/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