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
Réponses:
~/.ssh/config
:~/bin/cluster-connect
:la source
netcat $(get_host) 22
) fonctionne très bien pour la connexion. Mais, il ne semble pas transmettre mes informations d'identification Kerberos. J'aiGSSAPIAuthentication yes
etGSSAPIDelegateCredentials yes
sousHost cluster
dans mon.ssh/config
fichier, et ils fonctionnent si le HostName est donné explicitement, mais pas si je passe par le ProxyCommand. Pensées? Je vais également modifier la question.ssh
devez connaître le nom d'hôte cible pour obtenir le ticket correct, et il n'y a tout simplement aucun moyen de le fournir dynamiquement (à moins d'utiliser un wrapper qui s'exécute simplementssh $(get_host) "$@"
, ce que, si j'ai bien compris, vous ne voulez pas ). Cela peut fonctionner si tous les serveurs du cluster ont le même principal Kerberos, mais je ne pense pas que quiconque le fasse.