SSH接続で「書き込みに失敗しました:パイプが壊れています」を防ぐ方法


283

Write Failed: broken pipeエラーを防ぐために、クライアントとサーバーの両方でSSHを構成するにはどうすればよいですか?クライアントコンピューターをスリープ状態にして後で再開した場合によく発生します。


8
本当に何もない。セッションが中断され、セッションのセキュリティが侵害されました。コンプをスリープ状態にしない場合、クライアントがキープアライブハートビートをサーバーに送信するためのキープアライブ時間を設定できますが、システムがスリープ状態になると、実行できることはありません。
-darkdragn

3
この場合、私は(おそらく終了コードに基づいて)壊れたssh接続を再開始し、screen?を使用して復元できるものを探していますか?
ソリン

4
あなたの人々は間違っています:同じサーバーに接続している2台のデスクトップクライアントマシンがあります。1つはQuantalのubuntu 12.10で、SSHクライアントは正常に機能し、数時間接続を維持します。もう1つはUbuntu 14.10、Utopicで、もう1つは脇にあり、新規インストールです。数分後、このメッセージで自分自身をブロックします。マシン内の残りのネットワーク機能は中断されません。いいえ、それはネットワークの問題でもサーバーの問題でもありませんが、特定のSSH CLIENTソフトウェアの問題であり、「darkdragan」が敢えて言う「何もできない」とは反対に解決できます。
デビッドL 14

2
そして実際、私が言ったように、@ darkdragnがあえて言ったように、人々は「何もできない」と言うと、あまりにも多くのことを話します。Aram Kocharyanの答えを読んで、それを適用しました:20分前...古いQuantal Ubuntu 12.10で、2年前にそのファイルに命令を適用していたことに気づきました。安定性の理由。私はここでそれをしました、そして、この最後の20分で、接続はそれ以来安定しています。だから、人々:「何もできない」と思い切って自分自身を控え、そのメッセージを他の人に残そうとするときはさらに控えてください。
デビッドL 14

11
@DavidLあなたは暴言の前に質問をよく読むべきです。あなたの問題は、コンピューターをスリープ状態にすることを明確に述べているOPの問題とは異なります。ちなみに、回答の1つのみ(「mosh」)であり、質問の2年後に投稿されました。しかし、他の答えは次に良いことをします。それは、あなたのような、より簡単に解決できるケースの解決策を提案することです。落ち着いて、それほどストレスをかけないでください、暴言はこの辺では何の役にも立ちません
...-msb

回答:


266

私はこれ/etc/ssh/ssh_configをLinuxとMac で試しました:

Host *
ServerAliveInterval 120

これは、キープアライブメッセージをサーバーに送信する頻度(秒単位)です。それでもうまくいかない場合は、作業中に2分ごとにEnterキーを押すようにサルを訓練します。

あなたは、どちらかの設定ができServerAliveInterval/etc/ssh/ssh_config、クライアントマシンのかClientAliveInterval/etc/ssh/sshd_configサーバマシンの。それでもエラーが発生する場合は、間隔を短くしてください。

単一ユーザーの構成は~/.ssh/config、サーバー側とクライアント側の両方でファイルに設定できます。ファイルに正しい権限があることを確認してくださいchmod 644 ~/.ssh/config


4
私はMacを使用していませんが、Ubuntu 12.04とこのオペレーティングシステムのファイルも〜/ .ssh / configのようです。
H2ONaCl

5
OS X 10.8.4でエラーが発生するBad configuration option: ClientAliveInterval
-ohho

3
Bad configuration optionOSX 10.8.4でも同じエラーが発生します。
ニックハイナー

10
通常、これらの2つのコマンドはシステムの異なる部分に配置します。OSXクライアント側のServerAliveInterval ...とだけClientAliveIntervalのsshdの設定ファイルに...のみ
ftrotter

2
私の猿は私に言った:「なぜあなたは「トップ[ENTER]」と入力しないのですか?
8

85

SSHセッションは、多数の避けられない理由により中断する場合があります。

これによって引き起こされる問題を軽減するために使用できる便利なユーティリティは、と呼ばれscreenます。Screenは、sshセッションとは独立して存続する複数の端末を制御できる強力なユーティリティです。たとえばscreen、sshセッションで実行すると、新しいターミナルが開き、それを使用してジョブを実行できます。プロセスでsshセッションが停止したとしましょう。screen -dその後、実行screen -rすると最後のセッションが再開され、そこから続行できます。使用する前に、必ずドキュメントを読んでください。


5
これがおそらく最良の答えです。なぜより高く投票されないのか分かりません。他の「修正」は、実際にSSH接続を維持する特別な場合に役立ちますが、ほとんどのユースケースでは、クライアント/サーバー接続の問題に関係なく、意図したプロセスが実行し続けることが本当の懸念だと思います。
ポールマクマーディ

16
スクリーンの代替としてTmuxも追加します。スクリーンよりも用途が広く安定しています。
fridaymeetssunday

2
将来の参考のためにここに残しておくだけでscreen -d -r、最後のセッションを回復するために便利に実行できます。
-doplumi

2
または単にscreen -dr。またはscreen -x、何を計画しているかによって異なります。重要なのは、それらすべてのスイッチが何をするかを知って、インターネットの人々の提案に盲目的に従うのではなく、適切なスイッチを使用できるようにすることです。ここに利用可能なコンパクトな要約があります:ss64.com/bash/screen.html
flith

これは、問題への答えではありません
user3728501

46

クライアント構成

ファイルを作成してみてください:

~/.ssh/config

内容を追加します。

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

サーバーにsshし、問題が修正されたかどうかを確認します。ClientAliveIntervalオプションは、sshサーバー(別名sshd)を構成する場合にのみ有用であり、sshクライアント側のことは変更しないため、上記の構成ファイルでは使用しないでください。

これにより、前の30秒間にパケットが受信されなかった場合(上記で指定したとおり)、サーバーにHello-are-you-there信号が送信されます。ただし、連続するhello-are-you-there信号の数がServerAliveCountMaxに達すると、sshはサーバーから切断します。この値はデフォルトで3に設定されているため(3 * 30 =サーバーアクティビティなしの90秒)、必要に応じて値を増やします。.ssh / configファイルにはさらに多くの設定オプションがあり、次のように読むことができます。

SSH構成ファイルの使用

他のオプションの詳細については。この例が接続するすべてのサーバーにこれを適用したくない場合があります。または、行Host *Host <IP>(IPアドレスで置き換え、ssh_configのマニュアルページを参照)に置き換えて、特定のサーバーのみに制限します。

サーバー構成

同様に、サーバーにクライアントに優しいことを伝えることができます。構成ファイルは/etc/ssh/sshd_configです。

ClientAliveInterval 20
ClientAliveCountMax 5

あなたは設定して、それを無効にすることができますいずれかClientAliveInterval0または微調整ClientAliveIntervalし、ClientAliveCountMaxプローブに応答することなく、最大のsshクライアントの非アクティブを設定します。TCPKeepAliveに対するこの設定の利点の1つは、信号が暗号化されたチャネルを介して送信されるため、なりすましの可能性が低くなることです。


機能しません。私は再び同じエラーに直面しています。
ユーザー997704

3
コマンドラインから直接試して、値を下げてください:ssh -o ServerAliveInterval = 5 user @ host
Matt

それも試してみました。うまくいきません。私のシステムで何が起こっているのか本当にわかりません
-user997704

2
ClientAliveMaxCountではなくClientAliveCountMax
デビッドG

@DavidG修正を加えて回答を編集してください。
CivMeierFan

23

Ubuntuサーバーをリモートから明快から正確にアップグレードし、アップグレードの途中で「Write failed。Brocken pipe」というメッセージでssh接続を失いました。ClientAliveIntervalとServerAliveIntervalは何もしませんでした。解決策は、クライアントsshでTCPKeepAliveオプションを有効にすることです。

TCPKeepAlive yes

/etc/ssh/ssh_config

20

クライアントの場合、次のように~/.ssh/config(または/etc/ssh/ssh_config)ファイルを編集します。

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive-システムがTCPキープアライブメッセージを相手側に送信するかどうかを指定します。それらが送信された場合、接続の切断またはマシンの1つのクラッシュが適切に通知されます。ただし、これは、ルートが一時的にダウンした場合に接続が切断されることを意味し、一部の人はそれが迷惑だと感じます(デフォルトは「yes」です)。

ServerAliveInterval-サーバーからデータを受信して​​いない場合、ssh(1)は暗号化されたチャネルを介してメッセージを送信し、サーバーからの応答を要求するまでのタイムアウト間隔を秒単位で設定します。デフォルトは0で、これらのメッセージがサーバーに送信されないことを示します。


サーバーの場合、次のように編集します/etc/ssh/sshd_config

ClientAliveInterval 600
ClientAliveCountMax 0

sshクライアントを10分(600秒)後に自動的に終了(タイムアウト)したい場合。

ClientAliveCountMax –これは、sshクライアントから応答を取得せずにsshサーバーによって送信されたcheckaliveメッセージの総数を示します。デフォルトは3です。

ClientAliveInterval –これはタイムアウトを秒単位で示します。x秒後、sshサーバーはクライアントに応答を求めるメッセージを送信します。デフォルトは0です(サーバーは確認のためにクライアントにメッセージを送信しません)。


参照:オプションServerAliveIntervalClientAliveIntervalsshd_configの正確な動作は?


ServerAliveCountMaxをクライアントのデフォルトよりも高く設定すると、低速接続でも接続を維持できます。
jonnyjandles

17

私は絶対にモッシュが大好きです。私は頻繁にサーバーにsshし、ラップトップを閉じてカフェに行き、開いて、何も変わらないように続けます。

モッシュ(モバイルシェル)

ローミングを許可し、断続的な接続をサポートし、ユーザーのキーストロークのインテリジェントなローカルエコーとライン編集を提供するリモートターミナルアプリケーション。

MoshはSSHの代替品です。特にWi-Fi、セルラー、および長距離リンクを介した、より堅牢で応答性に優れています。

Moshは、GNU / Linux、FreeBSD、Solaris、Mac OS X、およびAndroidで利用できるフリーソフトウェアです。


6

私にとっては、Write failed: Broken pipevimやシェルプロンプトで積極的に入力しているときでも取得できました。私もしばらくインターネットをローカルで閲覧することができませんでした。(ターミナルを使用してUbuntuにリモートで接続していました。)

私のネットワークの他の人は、Netflixや他の場所から多くのビデオをストリーミングしています。私はそれを証明することはできませんが、ISPまたはルーターの問題を疑っています。たとえば、VerizonとNetflixは、顧客のネットワークの問題について互いに指を指し合っています。

ダイヤルアップ接続を使用していて、同時にSSHまたはtelnet接続でビデオまたは音楽をストリーミングしている場合、ある時点で壊れたパイプメッセージが表示されます。ISPのブロードバンドパッケージをアップグレードすると、接続が切断される頻度が少なくなるようです。



3

リモートサーバーに、SSH構成クライアントまたはサーバーに関係なく、失敗しないスクリプトがあります。

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

これをdummy.shファイルに保存し、ウィンドウを最小化するか、ウィンドウから離れる前に素早く実行します。サーバー上の現在のタイムスタンプを印刷し続け、他の理由で接続が切断されない限り、接続を維持します。そのターミナルに戻ったら、CTRL + Cを押して作業を続けます。


9
あるいは単にままtop実行している
エベンギヤー

1

sshを呼び出すたびに、これらの引数を追加できます。 -o ServerAliveInterval=15 -o ServerAliveCountMax=3

これを行う場合、/ etc / ssh / * configファイルを編集する必要はありません。

これを簡単にするために、bashエイリアス、関数、またはスクリプトを作成できます。

たとえば、これらのbash関数は、.bashrcに追加できます。do_sshはキープアライブを有効にするために手動で使用されます。do_ssh_ptyはスクリプト内で使用され、ptyを設定してプロンプトを回避します。

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 $*
}

これdo_ssh user@hostで使用できるようになりdo_ssh user@host <args> <command>、キープアライブがアクティブになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.