web-dev-qa-db-ja.com

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

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

276
sorin

LinuxとMacの/etc/ssh/ssh_configでこれを試しました。

Host *
ServerAliveInterval 120

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

クライアントマシンの/etc/ssh/ssh_configServerAliveIntervalを設定するか、サーバーマシンの/etc/ssh/sshd_configClientAliveIntervalを設定できます。それでもエラーが発生する場合は、間隔を短くしてください。

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

262
Aram Kocharyan

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

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

82
eltommo

クライアント構成

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

~/.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に設定するか、ClientAliveIntervalClientAliveCountMaxを調整して、プローブに応答せずに最大のsshクライアントの非アクティブを設定することで、非アクティブ化できます。 TCPKeepAliveに対するこの設定の利点の1つは、信号が暗号化されたチャネルを介して送信されるため、なりすましの可能性が低くなることです。

46
Matt

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

TCPKeepAlive yes

/etc/ssh/ssh_config
23
Alexey Sviridov

クライアントの場合、~/.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サーバーによって送信されたチェックアライブメッセージの総数を示します。デフォルトは3です。

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


参照: sshd_configのオプションServerAliveIntervalおよびClientAliveIntervalは正確に何をしますか?

20
kenorb

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

Mosh(モバイルシェル)

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

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

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

17
Jake

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

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

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

5
Parag

Ubuntu VMではないので、ここに答えを投稿しました。

https://unix.stackexchange.com/questions/259225/packet-write-wait-broken-pipe-even-leaving-top-running

ssh -o IPQoS=throughput user@Host
3
rupert160

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

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

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

3
JulioHM

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>とキープアライブがアクティブになります。

1
gaoithe