¿Cómo obtener HostName del script ejecutable en el archivo de configuración SSH?

10

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 HostNamediná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 ProxyCommandpuede ser un script que obtiene el nombre de host y reenvía la sshconexión con netcato 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-wrappercomo un sshalias para hacer una reescritura dinámica en el sshargumento 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
David B.
fuente
Pregunta relacionada sobre la falla del servidor .
Michael - ¿Dónde está Clay Shirky?

Respuestas:

6

~/.ssh/config:

Host cluster
    ProxyCommand ~/bin/cluster-connect

~/bin/cluster-connect:

#!/bin/bash
socat stdio tcp:$(get_host):22
usuario1686
fuente
Gracias. Esto (o netcat $(get_host) 22) funciona muy bien para la conexión. Pero, no parece pasar mis credenciales de Kerberos. Tengo GSSAPIAuthentication yesy GSSAPIDelegateCredentials yesmenos Host clusteren mi .ssh/configarchivo, y funcionan si HostName tiene explícitamente, pero no si enruto a través del ProxyCommand. Pensamientos? También enmendaré la pregunta.
David B.
No creo que pueda lograr eso: sshdebe conocer el nombre de host de destino para obtener el ticket correcto, y simplemente no hay forma de proporcionarlo dinámicamente (a menos que use un contenedor que simplemente se ejecute ssh $(get_host) "$@", lo que, como entendí, no quiere ) Se puede funcionar si todos los servidores del clúster tienen el mismo principal de Kerberos, pero no creo que nadie lo hace.
user1686
Desafortunado, pero tiene sentido. Escribí un contenedor rápido para hacer una búsqueda / reemplazo dinámico (agregado a la pregunta). Se romperá en algunos escenarios, pero funciona para mí.
David B.
¿
Búsqueda
Solo una sustitución sed en los argumentos de la línea de comandos para ssh, desde un mapeo de script host-alise a host-generation-script almacenado en el script.
David B.