web-dev-qa-db-ja.com

「書き込みに失敗しました:壊れたパイプ」でSSH接続がフリーズします

Ubuntu 11.04マシンからSSH経由でCentOS 5.5ボックスに接続しています。

接続はアクティブに使用されているときは期待どおりに機能しているように見えます(つまり、遅延や損失はありません)が、しばらく非アクティブのままになっていると、フリーズして応答しなくなります。最終的に、「書き込みに失敗しました:パイプが壊れました」というエラーメッセージが返され、ローカルマシンのプロンプトに戻ります。

これをデバッグし、何が起こっているのかを見つけ、これを解決するために私はどのようなことができますか?開発者として、これは私の人生を絶えず再接続しなければならない苦痛にしています。

12
Stephen RC

CentOSボックスのSSHD構成がクライアントのキープアライブを実行するように設定されていないようです。

これらの2行をCentOS sshd構成(/ etc/ssh/sshd_config)にドロップし、再起動してお楽しみください!

KeepAlive yes
ClientAliveInterval 60

その間、CentOS側でセッションを存続させるためにgnu screenを使用することをお勧めします。

15
yuriismaster

実際の答えは、ほとんど常に、パスに何らかの種類のNATデバイス、通常はファイアウォールがあり、そのステートテーブルがかなり積極的なタイムアウトを持っていることです。ssh接続をアイドル状態のままにしておくためです。 NATデバイスは、内部アドレスと送信元ポート番号の間のマッピング、およびエフェメラルな外部NAT済みアドレスとポート番号の間のマッピングを「忘れます」。

後でそのsshウィンドウで何かを行おうとすると、新しい一時アドレス/ポートのペアが割り当てられます。宛先のsshサーバーはこれを認識せず、応答しません。その後、ローカルタイムアウトになり、ローカルマシンによって接続がドロップされます。

これに対する実用的な修正は、yuriismasterが提案するとおり正確に行うことです。キープアライブを有効にし(これにより、定期的にトラフィックがそのステートテーブルエントリを「くすぐる」ようになります)、リモート側でscreenを使用します(イベントの状態を保持するには)落とされる)。あなたが何が起こっているのか、そしてそれに対して何をすべきかを尋ねたので、私はこの答えを投稿するだけです。うまくいけば、これが明確になりますwhy yuriismasterの提案は良いものです。

9
MadHatter