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?
quelle
&
am Ende Ihres SSH-Befehls:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
while
läuft meine Schleife immer wieder und startetssh
alle 5 Sekunden eine neue Hintergrundverbindung , oder? Das brauche ich nicht.Antworten:
Es hört sich so an, als ob Sie die
-N
Option ssh möchten .quelle
Ich würde Ihnen dringend empfehlen, darüber nachzudenken
autossh
. Es verfügt über bestimmte Heuristiken, die es ermöglichen, festzustellen, ob der Verbindungsverlust der zugrunde liegende Grund ist, und die Häufigkeit von Wiederverbindungsversuchen zu verringern. Darüber hinaus überwacht es die Verbindung mit zusätzlichen Tunneln, was es für Szenarien wie die, nach denen Sie fragen, äußerst nützlich macht.Wenn Sie beispielsweise mit Ubuntu arbeiten, können Sie eine Websuche durchführen
autossh upstart
, um einige nützliche Beispiele für die Konfiguration von Ubuntu zu finden, damit der Tunnel dauerhaft aufrechterhalten wird.Ich verwende dies, um eine getunnelte Verbindung zu meinem Server für bestimmte Dienste jederzeit offen zu halten.
quelle
autossh
, diesen Artikel zu lesen: goo.gl/jVuuSR , aber es hat nur bei mir funktioniert, wenn ich beim Systemstart sofort eine Internetverbindung habe. Aber wenn die Verbindung später hergestellt wird, hat es nicht funktioniert. Nicht sicher, vielleicht habe ich etwas falsch, aber selbst in diesem Artikel Autor hatsleep 10
in seinem/etc/rc.local
, um sicher zu sein , Internet - Verbindung ist bereits fertig , wenn autossh genannt wird.upstart
und anderen Init-Ersetzungen können Sie den Start des Tunnels an ein oder mehrere Netzwerkgeräte binden, die in Betrieb sind. Die beste der Lösungen (IMO) im Web ist die folgende: erik.torgesta.com/tag/ssh-upstart ... undsleep 10
in einigen Randfällen hilft nichts .ssh-upstart
, ich werde es mir ansehen!Ich werde @ 0xC0000022Ls Vorschlag unterstützen und auch verwenden
autossh
. Ich verwende es, um eine SSH-Verbindung von meinem Laptop aus aufrechtzuerhalten, während ich sie von Ort zu Ort bringe und sie funktioniert einfach. Ich benutze diese Verbindung, um die Ports 25 und 2143 für den Zugriff auf meine persönlichen SMTP- und IMAP-Server zu tunneln.Hier ist das Skript, das ich benutze:
Ich pflege dann einen
Host
Eintrag in meiner$HOME/.ssh/config
Datei für den Hostimap-o
.Das
autossh_mail.sh
Skript wird als Teil meines Desktops ausgeführt, wenn ich mich anmelde. Sie können über darauf zugreifengnome-session-properties
.quelle