Ich habe einen Haufen nicht mehr ganz neuer Computer, die ich an einen kleinen Computercluster angeschlossen habe, warum auch nicht. Ich habe einen einzigen Masterknoten mit einer öffentlichen IP-Adresse, mit der alle diese Computer kommunizieren können. Die Arbeitsknoten befinden sich hinter einem NAT. Um mit ihnen allen kommunizieren zu können, lasse ich sie beim Booten alle einen umgekehrten SSH-Tunnel zum Masterknoten erstellen. Somit sind sie alle über einen anderen Port mit dem Master verbunden. Jeder Computer wählt einen Port, n+1
wobei n
die Portnummer des vorherigen Computers ist. In meiner SSH-Konfiguration auf meinem Laptop habe ich Folgendes:
Host worker*
ProxyCommand ssh master -W %h:%p
HostName localhost
Host worker001
Port 7001
Host worker002
Port 7002
....
#Host workerX
# Port 7000 + X
Ich möchte einen einzigen Eintrag für meine Worker haben, sodass workerX Port 7000 + X verwendet. Ist das mit der SSH-Konfiguration möglich? Wenn nicht, gibt es eine andere Problemumgehung, um dies zu erreichen? Kann ich alternativ meine SSH-Konfiguration „aufteilen“, sodass meine ~/.ssh/config
Datei nicht hundert Zeilen enthält workerX
und ich das ganze Durcheinander eindämmen kann?
Antwort1
Sie verwenden ProxyCommand, schreiben Sie also einfach einen benutzerdefinierten Befehl, der Folgendes tut:
ProxyCommand ~/bin/worker-ssh %h
Das Skript selbst könnte folgendermaßen aussehen:
#!/usr/bin/env bash
host=$1
if [[ $host =~ ^worker0*([0-9]+)$ ]]; then
port=${BASH_REMATCH[1]}
port=$(( port + 7000 ))
ssh master -W "localhost:$port"
else
echo "error: $0: host '$host' is not a worker" >&2
exit 1
fi
(Nicht HostName
in diesem Zusammenhang verwenden; der Proxy-Befehl muss offensichtlich den ursprünglichen Hostnamen kennen.)