J'ai souvent besoin de ssh sur un ordinateur arbitraire à partir d'un cluster particulier (toutes les machines du cluster sont identiques). Cependant, l'ensemble des machines disponibles dans le cluster change fréquemment, j'ai donc un script qui renvoie un nom d'hôte arbitraire du cluster qui est disponible et correspond à mes besoins (par exemple, en ligne et exécutant le bon système d'exploitation).
Notez également que j'utilise le transfert d'informations d'identification Kerberos (GSSAPIAuthentication) pour l'authentification.
En ce moment, j'utilise ssh ssh `get_host`
. Je voudrais plutôt exécuter ssh cluster
. Avec un nom d'hôte connu, c'est facile avec ce qui suit dans /ssh/config
:
Host cluster
HostName static_host.cluster.domain.tld
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
Comment puis-je sélectionner le HostName
dynamiquement, en utilisant mon script? (Ou SSH a-t-il une méthode différente pour prendre en charge la fonction souhaitée?) Je voudrais faire quelque chose comme ceci, mais cela ne fonctionne pas:
Host cluster
HostName `get_host` # This does not work
...
Grawity a montré que le ProxyCommand
peut être un script qui obtient le nom d'hôte et transmet la ssh
connexion à l'aide de netcat
ou socat
. Cependant, cela ne transfère pas les informations d'identification Kerberos. De l'aide est également appréciée.
ÉDITER:
Vous ne pouvez pas faire cela avec Kerberos comme je le voudrais (voir les commentaires dans la réponse acceptée). Donc, j'utilise ce script, ssh-wrapper
comme ssh
alias pour effectuer une réécriture dynamique sur l' ssh
argument de ligne de commande. Ce n'est pas robuste, mais ça marche pour moi.
#!/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