Ich muss häufig von einem bestimmten Cluster aus in einen beliebigen Computer ssh (alle Computer im Cluster sind identisch). Die Anzahl der verfügbaren Computer im Cluster ändert sich jedoch häufig, sodass ich ein Skript habe, das einen beliebigen Hostnamen aus dem verfügbaren Cluster zurückgibt, der meinen Anforderungen entspricht (z. B. online und mit dem richtigen Betriebssystem).
Beachten Sie auch, dass ich die Weiterleitung von Kerberos-Anmeldeinformationen (GSSAPIAuthentication) zur Authentifizierung verwende.
Im Moment ssh ich mit ssh `get_host`
. Ich möchte stattdessen ausführen ssh cluster
. Bei einem bekannten Hostnamen ist dies mit den folgenden Anweisungen einfach /ssh/config
:
Host cluster
HostName static_host.cluster.domain.tld
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes
Wie kann ich das HostName
mithilfe meines Skripts dynamisch auswählen ? (Oder hat SSH eine andere Methode, um meine gewünschte Funktion zu unterstützen?) Ich möchte Folgendes tun, aber es funktioniert nicht:
Host cluster
HostName `get_host` # This does not work
...
Grawity hat gezeigt, dass es ProxyCommand
sich um ein Skript handeln kann, das den Hostnamen abruft und die ssh
Verbindung mit netcat
oder weiterleitet socat
. Dadurch werden die Kerberos-Anmeldeinformationen jedoch nicht weitergeleitet. Hilfe dabei wird ebenfalls geschätzt.
BEARBEITEN:
Sie können dies mit Kerberos nicht wie gewünscht tun (siehe Kommentare in der akzeptierten Antwort). Daher verwende ich dieses Skript ssh-wrapper
als ssh
Alias für das dynamische Umschreiben des ssh
Befehlszeilenarguments. Es ist nicht robust, aber es funktioniert für mich.
#!/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