Frage Wie verhindert man "Write Failed: defekte Pipe" bei SSH-Verbindung?


Was kann ich tun, um SSH auf Client und Servern zu verhindern? Write Failed: broken pipe Fehler? Es tritt häufig auf, wenn Sie Ihren Clientcomputer schlafen und später fortsetzen.


232
2018-04-28 23:36


Ursprung


Nichts wirklich. Die Sitzung wurde unterbrochen und die Sicherheit der Sitzung wurde beeinträchtigt. Wenn Sie die Komponente nicht in den Ruhezustand versetzen, können Sie eine Haltezeit für den Client festlegen, um einen Herzschlag auf den Server zu setzen. Wenn das System jedoch in den Ruhezustand versetzt wird, kann nichts getan werden. - darkdragn
In diesem Fall suche ich nach etwas, das es mir erlauben würde, eine unterbrochene SSH-Verbindung (basierend wahrscheinlich auf dem Exit-Code) neu zu initiieren und die Verwendung wiederherzustellen screen? - sorin
Sie haben sich geirrt: Ich habe zwei Desktop-Client-Rechner, die sich mit dem gleichen Server verbinden. Einer ist ubuntu 12.10, Quantal, dessen SSH-Client gut funktioniert und die Verbindung stundenlang hält. Der andere ist Ubuntu 14.10, Utopic, nur neben dem anderen und in einer neuen Installation; nach ein paar Minuten blockiert es sich mit dieser Nachricht. Der Rest der Netzwerkfunktionen in der Maschine wird nicht unterbrochen. Also nein, es ist weder ein Netzwerkproblem, noch ein Serverproblem, sondern ein spezifisches SSH CLIENT Softwareproblem, welches gelöst werden kann, was "Darkdragan" zu sagen wagt, dass "nichts getan werden kann". - David L
Und tatsächlich, wie gesagt: Die Leute reden zu viel, wenn sie sagen: "Nichts kann getan werden", wie @darkdragn es wagte. Ich las die Antwort von Aram Kocharyan, und ich wendete es an: vor 20 Minuten ... Ich erkannte, dass ich in meinem alten Quantal Ubuntu 12.10 diese Anweisung in dieser Datei [ich habe gerade überprüft] vor zwei Jahren angewendet hatte, und das war der Grund der Stabilität dort. Ich habe es hier gemacht, und in diesen letzten 20 Minuten war die Verbindung seitdem stabil. Also bitte, Leute: Unterlassen Sie sich selbst, wenn Sie es wagen zu denken, dass "nichts getan werden kann", und lassen Sie es sogar noch mehr aus, wenn Sie versuchen, diese Botschaft anderen Menschen zu überlassen. - David L
@DavidL solltest du die Fragen besser lesen bevor du schimpfst. Dein Problem ist nicht das gleiche wie bei den OP's, die klar sagen, den Computer in den Schlaf zu setzen. Was übrigens nur eine der Antworten angeht ("mosh"), und es wurde 2 Jahre nach der Frage gepostet. Die anderen Antworten machen jedoch die nächstbeste Lösung, die Lösungen für Fälle bietet, die leichter zu lösen sind, wie Ihre. Chill out, sei nicht so gestresst, Schimpfen tut hier nicht gut ... - msb


Antworten:


Ich habe das versucht /etc/ssh/ssh_config für Linux und Mac:

Host *
ServerAliveInterval 120

Dies ist, wie oft in Sekunden eine Keepalive-Nachricht an den Server gesendet werden soll. Wenn das nicht funktioniert, dann trainiere einen Affen, um während der Arbeit alle zwei Minuten die Eingabetaste zu drücken.

Du könntest beides einstellen ServerAliveInterval im /etc/ssh/ssh_config der Client-Maschine oder ClientAliveInterval im /etc/ssh/sshd_config der Servermaschine. Versuchen Sie, das Intervall zu verringern, wenn der Fehler weiterhin auftritt.

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


211
2018-05-26 11:49



Ja, ich mache das ähnlich und es funktioniert ziemlich gut für die meisten Dinge. - Oli♦
Ich bin nicht auf einem Mac, aber Ubuntu 12.04 und die Datei für dieses Betriebssystem scheint auch ~ / .ssh / config zu sein. - H2ONaCl
OS X 10.8.4 gibt einen Fehler aus Bad configuration option: ClientAliveInterval - ohho
Ich verstehe das auch Bad configuration option Fehler unter OSX 10.8.4. - Nick Heiner
Im Allgemeinen fügen Sie diese beiden Befehle in verschiedene Teile des Systems ein. Only ServerAliveInterval auf der OSX-Client-Seite ... und nur ClientAliveInterval auf der sshd-Konfigurationsdatei ... - ftrotter


SSH-Sitzungen können aufgrund zahlreicher und möglicherweise unvermeidbarer Gründe unterbrochen werden.

Ein nützliches Dienstprogramm, das verwendet werden kann, um dadurch verursachte Probleme zu verringern, wird aufgerufen screen. Screen ist ein leistungsfähiges Dienstprogramm, mit dem Sie mehrere Terminals steuern können, die unabhängig von der SSH-Sitzung am Leben bleiben. Zum Beispiel, wenn Sie laufen screen In einer SSH-Sitzung wird ein neues Terminal geöffnet und Sie können damit Jobs ausführen. Sagen wir, Ihre ssh-Sitzung stirbt dabei. Laufen screen -d dann screen -r Die letzte Sitzung wird wieder geöffnet und Sie können von dort aus fortfahren. Stellen Sie sicher, dass Sie lesen einige der Dokumentation bevor Sie es benutzen.


70
2017-10-04 16:28



Das ist wahrscheinlich die beste Antwort, ich bin mir nicht sicher, warum es nicht höher gewählt wurde. Die anderen "Fixes" sind hilfreich in dem speziellen Fall, in dem Sie eigentlich eine SSH-Verbindung pflegen möchten, aber in den meisten Anwendungsfällen stelle ich mir vor, dass die beabsichtigten Prozesse unabhängig von irgendwelchen Client / Server-Verbindungsproblemen weiterlaufen . - Paul McMurdie
Ich würde auch hinzufügen Tmux als Alternative zum Bildschirm. Ich finde es vielseitiger und stabiler als Bildschirm. - fridaymeetssunday
Lassen Sie das hier für zukünftige Referenz - Sie können bequem laufen screen -d -r um deine letzte Sitzung wiederherzustellen. - doplumi
Oder einfach screen -dr. Oder screen -x je nachdem, was Sie vorhaben. Der Punkt ist, man sollte wissen, was all diese Schalter tun, damit man die richtigen benutzen kann und nicht blind den Vorschlägen der Internet-Leute folgt. Es gibt eine schöne kompakte Zusammenfassung, die hier verfügbar ist: ss64.com/bash/screen.html - flith


Clientkonfiguration

Versuchen Sie, die Datei zu erstellen:

~/.ssh/config

Fügen Sie den Inhalt hinzu:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Jetzt ssh zu Ihrem Server und sehen, ob Ihr Problem behoben ist. Die Option ClientAliveInterval ist nur beim Konfigurieren des SSH-Servers (aka sshd) nützlich, sie ändert nichts auf der ssh-Clientseite, also verwenden Sie sie nicht in der obigen Konfigurationsdatei.

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

Verwenden einer SSH-Konfigurationsdatei

Für weitere Informationen zu anderen Optionen. Sie möchten dies möglicherweise nicht auf alle Server anwenden, die Sie mit diesem Beispiel verbinden. Oder beschränken Sie es nur auf einen bestimmten Server, indem Sie die Zeile ersetzen Host * mit Host <IP> (Ersetzen durch eine IP-Adresse, siehe ssh_config man-Seite).

Serverkonfiguration

Auf ähnliche Weise können Sie dem Server mitteilen, dass er mit Ihren Kunden vorsichtig umgehen soll. Die Konfigurationsdatei ist /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

Sie können es entweder deaktivieren, indem Sie es einstellen ClientAliveInterval zu 0 oder zwicken ClientAliveInterval und ClientAliveCountMax um eine maximale Inaktivität des SSH-Clients festzulegen, ohne auf die Sonden zu reagieren. Ein Vorteil dieser Einstellungen gegenüber TCPKeepAlive ist, dass die Signale über die verschlüsselten Kanäle gesendet werden, so dass es weniger wahrscheinlich ist, dass sie gefälscht werden.


40
2017-10-06 02:54



Es funktioniert nicht. Ich habe wieder denselben Fehler. - user997704
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 passiert - user997704
Es ist ClientAliveCountMax, NICHT ClientAliveMaxCount - David G
@DavidG Bitte bearbeite die Antwort mit deinen Korrekturen. - CivMeierFan


Ich bin remote Upgrade eines Ubuntu-Servers von klar bis präzise und verlor die SSH-Verbindung in der Mitte des Upgrades mit der Meldung "Schreiben fehlgeschlagen. Brocken Rohr". ClientAliveInterval und ServerAliveInterval haben nichts getan. Die Lösung besteht darin, TCPKeepAlive-Optionen in Client-SSH zu aktivieren:

TCPKeepAlive yes

im

/etc/ssh/ssh_config

22
2017-10-07 18:40





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

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - Gibt an, ob das System TCP-Keepalive senden soll   Nachrichten auf die andere Seite. Wenn sie gesendet werden, Tod der Verbindung   oder der Absturz einer der Maschinen wird richtig bemerkt. Jedoch,   Das bedeutet, dass die Verbindungen abstürzen, wenn die Route vorübergehend gesperrt ist.   und einige Leute finden es nervig (Der Standardwert ist 'Ja').

ServerAliveInterval - Legt ein Zeitüberschreitungsintervall in Sekunden fest   Wenn keine Daten vom Server empfangen wurden, sendet ssh (1) a   Nachricht über den verschlüsselten Kanal, um eine Antwort von der anfordern   Server. Der Standardwert ist 0, was bedeutet, dass diese Nachrichten nicht angezeigt werden   an den Server gesendet.


Bearbeiten Sie für den Server Ihre /etc/ssh/sshd_config wie:

ClientAliveInterval 600
ClientAliveCountMax 0

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

ClientAliveCountMax - Dies zeigt die Gesamtanzahl der Checkalive an   Nachricht, die vom SSH - Server gesendet wird, ohne dass eine Antwort vom   SSH-Client. Standard ist 3.

ClientAliveInterval - Dies zeigt das Zeitlimit in Sekunden an. Nach x   Anzahl von Sekunden, ssh Server sendet eine Nachricht an den Client fragt   für die Antwort. Deafult ist 0 (Server sendet keine Nachricht an den Client   prüfen.).


Siehe auch: Was machen die Optionen? ServerAliveInterval und ClientAliveInterval in sshd_config tun genau?


18
2017-10-02 13:52





Ich liebe Mosh. Ich gehe oft auf einen Server, schließe meinen Laptop und gehe in ein Cafe, öffne es und mache weiter, als ob sich nichts geändert hätte.

Mosh (bewegliche Schale)

Remote-Terminal-Anwendung, die es ermöglicht wandernd, unterstützt wechselnd   Konnektivitätund bietet intelligent lokal   Echo und Zeilenbearbeitung von Benutzeranschlägen.

Mosh ist ein Ersatz für SSH. Es ist robuster und reaktionsfähiger,   insbesondere über WLAN-, Mobilfunk- und Fernverbindungen.

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


15
2017-09-30 18:48





Für mich war ich gerade dabei Write failed: Broken pipe sogar wenn ich aktiv in vim oder an der Shell-Eingabeaufforderung tippte. Ich konnte auch nicht lokal für eine Weile im Internet surfen. (Ich habe Remote mit Ubuntu über Terminal verbunden.)

Andere in meinem Netzwerk streamen viele Videos von Netflix und anderen Orten. Ich kann es nicht beweisen, aber ich vermute es ist ein ISP oder Router Problem. Zum Beispiel zeigen Verizon und Netflix einander die Finger für die Netzwerkprobleme ihrer Kunden.

Wenn Sie eine DFÜ-Verbindung haben und Video oder Musik mit einer gleichzeitigen SSH- oder Telnet-Verbindung streamen, ist es unvermeidlich, dass Sie irgendwann eine Meldung über eine unterbrochene Leitung erhalten. Die Aktualisierung meines ISP-Breitbandpakets schien meine unterbrochene Verbindung weniger häufig zu machen.


4
2017-07-30 13:33