OpenSSH-Konfigurationsport programmgesteuert zuweisen?

OpenSSH-Konfigurationsport programmgesteuert zuweisen?

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+1wobei ndie 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/configDatei nicht hundert Zeilen enthält workerXund 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 HostNamein diesem Zusammenhang verwenden; der Proxy-Befehl muss offensichtlich den ursprünglichen Hostnamen kennen.)

verwandte Informationen