Wie vermeide ich "Write Failed: broken pipe" bei einer SSH-Verbindung?

283

Wie kann ich SSH sowohl auf dem Client als auch auf dem Server konfigurieren, um Write Failed: broken pipeFehler zu vermeiden ? Es tritt häufig auf, wenn Sie Ihren Clientcomputer in den Ruhezustand versetzen und später fortsetzen.

Sorin
quelle
8
Nichts wirklich. Die Sitzung wurde unterbrochen und die Sicherheit der Sitzung wurde beeinträchtigt. Wenn Sie den Comp nicht in den Ruhezustand versetzen, können Sie eine Keep Alive-Zeit festlegen, in der der Client einen Keep Alive-Herzschlag an den Server sendet. Wenn das System jedoch in den Ruhezustand versetzt wird, können keine Maßnahmen getroffen werden.
Darkdragn
3
In diesem Fall bin ich auf der Suche nach etwas, das es mir ermöglicht, eine unterbrochene SSH-Verbindung (wahrscheinlich basierend auf dem Exit-Code) erneut zu initiieren und mithilfe von wiederherzustellen screen.
Sorin
4
Sie irren sich: Ich habe ZWEI Desktop-Client-Computer, die eine Verbindung zum selben Server herstellen. Eines ist Ubuntu 12.10, Quantal, dessen SSH-Client gut funktioniert und die Verbindung stundenlang aufrechterhält. Das andere ist Ubuntu 14.10, Utopic, nur neben dem anderen und in einer neuen Installation; Nach ein paar Minuten blockiert es sich mit dieser Meldung. Die übrigen Netzwerkfunktionen des Geräts werden nicht unterbrochen. Also nein, es ist weder ein Netzwerk- noch ein Serverproblem, sondern ein spezifisches SSH CLIENT-Softwareproblem, das gelöst werden kann, im Gegensatz zu dem, was "darkdragan" zu sagen wagt, dass "nichts getan werden kann".
David L
2
Und in der Tat, wie gesagt: Die Leute reden zu viel, wenn sie sagen, dass "nichts getan werden kann", so wie es @darkdragn gewagt hat. Ich las die Antwort von Aram Kocharyan und wandte sie an: Vor 20 Minuten ... Ich erkannte, dass ich in meinem alten Quantal Ubuntu 12.10 diese Anweisung vor zwei Jahren in dieser Datei angewendet hatte [habe ich gerade überprüft], und das war der Grund für die Stabilität dort. Ich habe es hier gemacht und in den letzten 20 Minuten ist die Verbindung seitdem stabil. Also bitte, Leute: unterlassen Sie es, wenn Sie sich trauen zu glauben, dass "nichts getan werden kann", und unterlassen Sie es noch mehr, wenn Sie versuchen, diese Botschaft anderen Menschen zu überlassen.
David L
11
@DavidL Du solltest die Fragen vor dem Schimpfen besser lesen. Ihr Problem ist nicht dasselbe wie bei den OPs, bei denen deutlich wird, dass der Computer in den Ruhezustand versetzt wird. Was übrigens nur eine der Antworten betrifft ("mosh"), und es wurde 2 Jahre nach der Frage gepostet. Die anderen Antworten tun jedoch das nächstbeste: Sie schlagen Lösungen für Fälle vor, die einfacher zu lösen sind, wie Ihre. Chill out, sei nicht so gestresst,
Geschimpfe nützen

Antworten:

266

Ich habe dies /etc/ssh/ssh_configfür Linux und Mac ausprobiert :

Host *
ServerAliveInterval 120

So oft sollte in Sekunden eine Keepalive-Nachricht an den Server gesendet werden. Wenn das nicht funktioniert, trainieren Sie einen Affen alle zwei Minuten, um die Eingabetaste zu drücken, während Sie arbeiten.

Sie können entweder ServerAliveIntervalauf /etc/ssh/ssh_configdem Client-Computer oder ClientAliveIntervalauf /etc/ssh/sshd_configdem Server-Computer festlegen . Reduzieren Sie das Intervall, wenn der Fehler weiterhin auftritt.

Die Konfiguration für einen einzelnen Benutzer kann ~/.ssh/configsowohl auf der Server- als auch auf der Clientseite in einer Datei festgelegt werden . Stellen Sie sicher, dass die Datei über die richtigen Berechtigungen verfügt chmod 644 ~/.ssh/config.

Aram Kocharyan
quelle
4
Ich bin nicht auf einem Mac, aber Ubuntu 12.04 und die Datei für dieses Betriebssystem scheint auch ~ / .ssh / config zu sein.
H2ONaCl
5
OS X 10.8.4 gibt einen FehlerBad configuration option: ClientAliveInterval
ohho
3
Unter Bad configuration optionOSX 10.8.4 wird derselbe Fehler angezeigt.
Nick Heiner
10
Im Allgemeinen fügen Sie diese beiden Befehle in verschiedene Teile des Systems ein. Nur ServerAliveInterval auf der OSX-Client-Seite ... und nur ClientAliveInterval auf der SSHD-Konfigurationsdatei ...
Ftrotter
2
Mein Affe sagte zu mir: "Warum
tippst
85

SSH-Sitzungen können aus zahlreichen und möglicherweise unvermeidbaren Gründen unterbrochen werden.

Ein nützliches Hilfsprogramm, mit dem sich dadurch verursachte Probleme abmildern lassen, heißt screen. Screen ist ein leistungsstarkes Dienstprogramm, mit dem Sie mehrere Terminals steuern können, die unabhängig von der SSH-Sitzung am Leben bleiben. Wenn Sie beispielsweise screenin einer SSH-Sitzung arbeiten, wird ein neues Terminal geöffnet, mit dem Sie Jobs ausführen können. Nehmen wir an, Ihre SSH-Sitzung stirbt dabei. Wenn Sie screen -ddann screen -rausführen, wird die letzte Sitzung erneut geöffnet, und Sie können von dort aus fortfahren. Stellen Sie sicher, dass Sie einige der Dokumentationen gelesen haben, bevor Sie sie verwenden.

eltommo
quelle
5
Dies ist wahrscheinlich die beste Antwort. Ich bin mir nicht sicher, warum sie nicht höher bewertet wurde. Die anderen "Korrekturen" sind in dem speziellen Fall hilfreich, in dem Sie sich tatsächlich um die Aufrechterhaltung einer SSH-Verbindung kümmern würden, aber in den meisten Anwendungsfällen stelle ich mir vor, dass die beabsichtigten Prozesse unabhängig von irgendwelchen Client / Server-Verbindungsproblemen weiterhin ausgeführt werden .
Paul McMurdie
16
Ich würde auch Tmux als Alternative zum Bildschirm hinzufügen . Ich finde es vielseitiger und stabiler als Bildschirm.
Freitag,
2
Lassen Sie dies hier, um später nachzuschlagen. Sie können bequem screen -d -rIhre letzte Sitzung wiederherstellen.
Doplumi
2
Oder einfach screen -dr. Oder screen -xje nachdem, was Sie vorhaben. Der Punkt ist, man sollte wissen, was all diese Schalter tun, damit man die entsprechenden verwenden und nicht nur blindlings den Vorschlägen der Internet-Leute folgen kann. Hier gibt es eine nette kompakte Zusammenfassung: ss64.com/bash/screen.html
flith
Dies ist keine Antwort auf das Problem
user3728501
46

Client-Konfiguration

Versuchen Sie, die Datei zu erstellen:

~/.ssh/config

Fügen Sie den Inhalt hinzu:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Jetzt ssh auf deinen Server und schau, ob dein Problem behoben ist. Die Option ClientAliveInterval ist nur nützlich, wenn Sie den SSH-Server (auch als SSHD bezeichnet) konfigurieren. Sie ändert nichts auf der SSH-Clientseite. Verwenden Sie sie daher nicht in der obigen Konfigurationsdatei.

Dies sendet ein Hallo-bist-du-da-Signal an den Server, wenn in den letzten 30 Sekunden keine Pakete empfangen wurden (wie oben angegeben). Wenn jedoch die Anzahl der aufeinanderfolgenden Hello-Are-You-There-Signale ServerAliveCountMax erreicht, trennt ssh die Verbindung zum Server. Dieser Wert ist standardmäßig auf 3 eingestellt (also 3 * 30 = 90 Sekunden ohne Serveraktivität). Erhöhen Sie ihn, wenn er Ihren Anforderungen entspricht. Es gibt viel mehr Konfigurationsoptionen für die .ssh / config-Datei und Sie können lesen:

Verwenden einer SSH-Konfigurationsdatei

Weitere Informationen zu anderen Optionen. Möglicherweise möchten Sie dies nicht auf alle Server anwenden, mit denen Sie in diesem Beispiel verbunden sind. Oder beschränken Sie es auf einen bestimmten Server, indem Sie die Zeile Host *durch Host <IP>(durch eine IP-Adresse ersetzen, siehe Manpage ssh_config) ersetzen.

Serverkonfiguration

Ebenso können Sie den Server anweisen, mit Ihren Clients schonend umzugehen. Die Konfigurationsdatei ist /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

Sie können entweder deaktivieren , indem Sie ClientAliveIntervalauf 0oder zwicken ClientAliveIntervalund ClientAliveCountMaxeine maximale SSH - Client Inaktivität einzustellen , ohne an die Sonden zu reagieren. Ein Vorteil dieser Einstellungen gegenüber TCPKeepAlive besteht darin, dass die Signale über die verschlüsselten Kanäle gesendet werden, sodass es weniger wahrscheinlich ist, dass sie gefälscht werden.

Matt
quelle
Es funktioniert nicht Ich stehe wieder vor dem gleichen Fehler.
user997704
3
Probieren Sie es direkt von der Befehlszeile aus und gehen Sie nach unten: ssh -o ServerAliveInterval = 5 user @ host
Matt
Versuchte das auch ... funktioniert nicht. Ich weiß wirklich nicht, was mit meinem System los ist
user997704
2
Es ist ClientAliveCountMax, NICHT ClientAliveMaxCount
David G
@DavidG Bitte bearbeiten Sie die Antwort mit Ihren Korrekturen.
CivMeierFan
23

Ich aktualisiere einen Ubuntu-Server aus der Ferne von "lucid" auf "exact" und habe während des Upgrades die SSH-Verbindung mit der Meldung "Write failed. Brocken pipe" verloren. ClientAliveInterval und ServerAliveInterval haben nichts getan. Die Lösung besteht darin, die TCPKeepAlive-Optionen im Client ssh zu aktivieren:

TCPKeepAlive yes

im

/etc/ssh/ssh_config
Alexey Sviridov
quelle
20

Bearbeiten Sie für den Client Ihre ~/.ssh/config(oder /etc/ssh/ssh_config) Datei wie folgt:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - Gibt an, ob das System TCP-Keepalive-Nachrichten an die andere Seite senden soll. Wenn sie gesendet werden, wird der Verbindungsabbruch oder der Absturz einer der Maschinen ordnungsgemäß bemerkt. Dies bedeutet jedoch, dass die Verbindung unterbrochen wird, wenn die Route vorübergehend unterbrochen wird und einige Benutzer dies als störend empfinden (die Standardeinstellung lautet "Ja").

ServerAliveInterval - Legt ein Zeitlimit in Sekunden fest, nach dessen Ablauf ssh (1) eine Nachricht über den verschlüsselten Kanal sendet, um eine Antwort vom Server anzufordern. Der Standardwert ist 0, was angibt, dass diese Nachrichten nicht an den Server gesendet werden.


Bearbeiten Sie für den Server Folgendes /etc/ssh/sshd_configals:

ClientAliveInterval 600
ClientAliveCountMax 0

Wenn Sie möchten, dass der ssh-Client nach 10 Minuten (600 Sekunden) automatisch beendet wird (Timeout).

ClientAliveCountMax - Gibt die Gesamtzahl der vom SSH-Server gesendeten Checkalive-Nachrichten an, ohne dass der SSH-Client eine Antwort erhalten hat. Standard ist 3.

ClientAliveInterval - Gibt das Zeitlimit in Sekunden an. Nach x Sekunden sendet der SSH-Server eine Nachricht an den Client, in der er um Antwort bittet. Deafult ist 0 (Server sendet keine Nachricht zur Überprüfung an den Client).


Siehe auch: Was genau bewirken die Optionen ServerAliveIntervalund ClientAliveIntervalin sshd_config?

Kenorb
quelle
Das Festlegen eines ServerAliveCountMax-Werts höher als der Standardwert auf dem Client sollte auch dazu beitragen, die Verbindung für langsame Verbindungen aufrechtzuerhalten.
Jonnyjandles
17

Ich liebe Mosh absolut. Ich gehe häufig auf einen Server, schließe meinen Laptop und gehe in ein Café, öffne ihn und mache weiter, als ob sich nichts geändert hätte.

Mosh (mobile Schale)

Remote-Terminal-Anwendung, die Roaming ermöglicht , intermittierende Konnektivität unterstützt und intelligentes lokales Echo und Leitungsbearbeitung von Benutzertastenanschlägen bietet .

Mosh ist ein Ersatz für SSH. Es ist robuster und reaktionsschneller, insbesondere über Wi-Fi, Mobilfunk und Fernverbindungen.

Mosh ist freie Software für GNU / Linux, FreeBSD, Solaris, Mac OS X und Android.

Jake
quelle
6

Für mich war ich dabei, Write failed: Broken pipeselbst wenn ich aktiv in vim oder an der Shell-Eingabeaufforderung tippte. Ich konnte auch vor Ort eine Weile nicht im Internet surfen. (Ich habe über Terminal eine Remote-Verbindung zu Ubuntu hergestellt.)

Andere in meinem Netzwerk streamen viele Videos von Netflix und anderen Orten. Ich kann es nicht beweisen, aber ich vermute, dass es sich um ein ISP- oder Router-Problem handelt. Beispielsweise zeigen Verizon und Netflix bei Netzwerkproblemen ihrer Kunden mit dem Finger aufeinander.

Wenn Sie eine DFÜ-Verbindung haben und Videos oder Musik mit einer gleichzeitigen SSH- oder Telnet-Verbindung streamen, ist es unvermeidlich, dass Sie irgendwann eine kaputte Pipe-Nachricht erhalten. Durch die Aktualisierung des Breitbandpakets meines Internetdienstanbieters wurde meine unterbrochene Verbindung anscheinend seltener.

Parag
quelle
3

Ich habe ein Skript auf dem Remoteserver, das unabhängig vom SSH-Konfigurationsclient oder -Server scheinbar nie ausfällt.

#!/bin/bash
while true; do date; sleep 10; done;

Speichern Sie es in einer dummy.sh-Datei und führen Sie es schnell aus, bevor Sie das Fenster minimieren oder es verlassen. Der aktuelle Zeitstempel wird weiterhin auf dem Server gedruckt, und Ihre Verbindung bleibt bestehen, solange die Verbindung aus keinem anderen Grund getrennt wird. Wenn Sie zu diesem Terminal zurückkehren, drücken Sie einfach STRG + C und arbeiten Sie weiter.

JulioHM
quelle
9
oder einfach toplaufen lassen
Eben Geer
1

Sie können diese Argumente bei jedem Aufruf von ssh hinzufügen: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

In diesem Fall müssen Sie die Konfigurationsdateien / etc / ssh / * nicht bearbeiten.

Sie können einen Bash-Alias ​​oder eine Funktion oder ein Skript erstellen, um dies zu vereinfachen.

Diese Bash-Funktionen können Sie beispielsweise in Ihre .bashrc-Datei einfügen. Do_ssh wird manuell verwendet, um Keepalives zu aktivieren. do_ssh_pty wird in Skripten verwendet, um pty festzulegen und Eingabeaufforderungen zu vermeiden.

do_ssh() {
    ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

do_ssh_pty() {
    ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

Jetzt do_ssh user@hostkann verwendet werden oder do_ssh user@host <args> <command>und Keepalives werden aktiv.

Gaoithe
quelle