Verwandte Frage: Initiieren Sie eine SSH-Verbindung vom Server zum Client
Antwort von dort hat mir sehr geholfen, dieser Befehl macht was ich brauche:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
Also habe ich das Skript geschrieben, um die Verbindung immer wieder herzustellen:
#!/bin/bash
while true; do
echo "try to connect..."
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
echo "restarting in 5 seconds.."
sleep 5
done
Und fügte es dem /etc/crontab
. Aber ich habe herausgefunden, dass das funktioniert, wenn ich es nur "von Hand" aus der Shell heraus ausführe, aber wenn es von cron aufgerufen wird, verbindet sich ssh und beendet sich sofort. (Das obige Skript verbindet sich also immer wieder)
Von man ssh
, fand ich, dass für Hintergrundverbindungen ich es mit -n
Schlüssel nennen sollte , aber es half nicht. Dann habe ich mich nur nach ähnlichen Skripten tail -f something
umgesehen und festgestellt, dass es funktioniert, wenn ich einen "nie endenden" Befehl aufrufe. Deshalb habe ich gerade eine leere Datei erstellt /tmp/dummy_file
und jetzt sieht mein ssh-Befehl folgendermaßen aus:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
Es funktioniert jetzt! Aber diese Lösung scheint ein bisschen hässlich zu sein, und ich verstehe die tatsächlichen Gründe für dieses Verhalten nicht wirklich. Ich habe nur zufällig versucht, bash
anstelle von anzurufen tail -f
( bash
scheint mir auch ein "nie endender" Befehl zu sein), aber es funktioniert nicht.
Könnte jemand dieses Verhalten erklären und wie kann man eine Hintergrund-SSH-Verbindung herstellen, um den Reverse-SSH-Tunnel aufrechtzuerhalten?
while
läuft meine Schleife immer wieder und startet ssh
alle 5 Sekunden eine neue Hintergrundverbindung , oder? Das brauche ich nicht.
&
am Ende Ihres SSH-Befehls:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &