Wie kann ich verhindern, dass eine SSH-Sitzung in OS X Terminal hängt?


101

Wenn ich mein MacBook mit einer aktiven SSH-Sitzung im Terminal schließe und es dann aufwecke, reagiert die Eingabeaufforderung nicht mehr.

In ungefähr fünf Minuten heißt es

Write failed: Broken pipe

und endet.

Dies geschieht auch , wenn ich nicht geben Sie in etwa 15 Minuten alles im Terminal.

Kann ich OS X zwingen,

  1. Halten Sie die SSH-Verbindung so lange wie möglich aufrecht
  2. Töte es sofort, wenn es nicht mehr reagiert

?

Antworten:


121

Um die Verbindung am Leben zu erhalten , können Sie in /etc/ssh/ssh_configder Zeile, in der steht ServerAliveInterval, überprüfen , wie oft (in Sekunden) Ihr Computer ein Null-Paket senden wird, um die Verbindung am Leben zu erhalten. Wenn Sie dort eine 0 haben, die angibt, dass Ihr Computer nicht versucht, die Verbindung aufrechtzuerhalten (sie ist deaktiviert), wird Ihnen ansonsten mitgeteilt, wie oft (in Sekunden) das oben genannte Paket gesendet wird. Versuchen Sie, 120 oder 240 einzugeben. Wenn die Verbindung immer noch unterbrochen wird, können Sie den Wert auf 5 senken. Wenn dies nicht der Fall ist, wird die Verbindung möglicherweise von Ihrem Router in den freien Speicher verschoben.

Um es zu beenden, wenn es auflegt , können Sie das Escape-Zeichen ssh verwenden:

~.

Drücken Sie also die Tilde und dann den Punkt. Wenn dies nicht funktioniert, drücken Sie die Eingabetaste, bevor Sie darauf drücken. Dadurch wird die Verbindung sofort getrennt.


3
Ok, du kannst die Verbindung abbrechen mit ~., toller Tipp! Aber was macht es eigentlich?
CousinCocaine

Das einzige, worüber ich verwirrt war, war, ob ich sshd neu starten musste oder nicht, aber es scheint, als ob nur das Verlassen der Sitzung und das erneute
Verbinden

Oft ist die ~. arbeitet für mich seit einigen Minuten nicht Warum ist das so?
Sridhar Sarnobat

2
Der Speicherort von ssh_configist /etc/ssh/ssh_configunter Mac OS X. Ich würde die Antwort selbst bearbeiten, aber ich habe nicht genug Repräsentanten auf dieser Website, um dies zu tun.
Erik B

soll ich das in client oder server stellen? Ich denke Client, kann aber klarer sein.
EralpB

23

Du kannst:

Konfigurieren Sie Ihr System systemweit für alle Verbindungen. Bearbeiten Sie dazu: / etc / ssh / ssh_config, und fügen Sie die folgende Zeile hinzu:

ServerAliveInterval 10

Oder pro Server ~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

Was das im Grunde bedeutet, dass es alle 10 Sekunden ein Keep-Alive-Paket sendet ...


9

Sie können auch versuchen, das fantastische mosh-Projekt zu verwenden . Es behandelt Netzwerkverluste, Computer, die in den Energiesparmodus wechseln usw. ordnungsgemäß und stellt die Verbindung problemlos wieder her, wenn Sie wieder über ein funktionierendes Netzwerk verfügen.

Eine andere altehrwürdige Lösung ist die Verwendung von tmux auf dem Remote-Computer. In diesem Fall kann es immer noch zu einem Rohrbruch kommen, aber wenn Sie die Shell erneut verbinden, warten die Anwendungen genau so, wie Sie sie verlassen haben.


Genau das mache ich jetzt.
Dan

5

Die verschiedenen Antworten hier stehen in Konflikt bezüglich des genauen Pfads zu den Konfigurationsdateien. Vielleicht ist es in verschiedenen Unixen anders? Ich schlage vor, die Manpages auf Ihrem System zu lesen!

Suchen Sie in man ssh (1) nach text: config . Auf meinem System habe ich die Wahl zwischen systemweiten oder benutzerspezifischen Konfigurationsdateien (und die Pfade sind seltsamerweise unterschiedlich).

Suchen Sie in man ssh_config (5) nach text: alive . Auf meinem System muss anscheinend sowohl ServerAliveInterval als auch ServerAliveCountMax festgelegt werden .

Was für mich unter macOS 10.12 Sierra funktioniert hat, ist, die folgenden zwei Zeilen in ~ / .ssh / config einzufügen:

ServerAliveInterval 20
ServerAliveCountMax 180

Jetzt kann ich ohne Unterbrechung für 20 * 180 Sekunden = 1 Stunde auf meinen Ubuntu 16.04-Server sshen. Meinen Tag gerettet!


3

Ssh nach schlaf oder wifi unterbrechung automatisch wieder verbinden

  1. Installieren Sie autossh von MacPorts oder Homebrew:brew install autossh

  2. Öffnen Sie das Terminal und führen Sie es aus autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. Trennen Sie Ihr WLAN oder schalten Sie Ihren Mac in den Ruhezustand.

  4. Wenn Sie die Verbindung zum WLAN wiederherstellen, wird die SSH-Sitzung automatisch wiederhergestellt.


Automatisch ssh nach dem Login

Jon Stacey hat einen Blogbeitrag über das automatische Aktivieren einer SSH- Sitzung beim Anmelden geschrieben.

  1. Installieren Sie autossh von MacPorts oder Homebrew:brew install autossh

  2. Erstellen Sie einen Automator-Workflow mit einem Bash-Skript.

Automator-Shell-Skript

  1. Gehen Sie zu Anmeldeelementen in den Systemeinstellungen .

Systemeinstellungen> Anmeldeelemente

  1. Fügen Sie Ihren Automator-Workflow zu Anmeldeelementen hinzu .

Login-Elemente


1

Fügen Sie diese beiden Zeilen hinzu zu /etc/ssh/ssh_config:

ServerAliveInterval 60
TCPKeepAlive yes

1

Dieses Problem wurde gerade behoben. Fügen Sie die folgenden Zeilen hinzu $HOME/.ssh/config.

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

Die Einstellung TCPKeepAlive nosagt dem Client, dass er nur davon ausgehen soll, dass die Verbindung noch in Ordnung ist, bis eine Benutzeranforderung das Gegenteil bestätigt. Dies bedeutet, dass vorübergehende Verbindungsunterbrechungen, während Ihre SSH-Laufzeit im Hintergrund inaktiv ist, die Verbindung nicht beenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.