接続が失われ、sshがオンのときに端末がハングする


18

gnomeターミナルタブでインターネット経由でサーバーにSSH接続したときに、インターネット接続が失われた場合、ターミナルタブがハングし、入力が受け入れられません。なぜハングするのですか?

ターミナルタブをアクティブにする方法、つまりローカルシェルプロセスの実行を継続する方法はありますか?

端子タブを閉じることが唯一の方法ですか?

回答:


20

SSH接続はClientAliveIntervalClientAliveCountMaxパラメータおよびそれらに相当するクライアント側で設定された指定期間後に自動的にダウンします。これらのタイムアウトが非常に大きい場合、シェルがフリーズします。ただし、使用するOpenSSH場合、タイムアウトを待つ必要はなく、エスケープ文字を使用して接続を強制的に閉じることができます

ESCAPE CHARACTERS
When a pseudo-terminal has been requested, ssh supports a number
of functions through the use of an escape character.  A single
tilde character can be sent as ~~ or by following the tilde by a
character other than those described below. The escape character
must always follow a newline to be interpreted as special. The
escape character can be changed in configuration files using the
EscapeChar configuration directive or on the command line by the
-e option.
The supported escapes (assuming the default ‘~’) are:

~.
    Disconnect.
(...)

接続がフリーズしたら~Shift+ `キーを同時に押す)、接続を解除してを押し.ます。あるいは、不安定な接続で作業している場合、またはautosshを使用して失われた接続を自動的に更新できる場合に常にリモートサーバーに接続する必要がある場合は、非常に便利です。

編集

ただし、両方ClientAliveIntervalServerAliveIntervalが明示的に0に設定されているか、明示的に設定されておらずsshd_configssh_configマンページに従ってデフォルトで0に設定されている場合、タイムアウト設定は次のファイルで設定されます(http://tldp.org/HOWTO/TCP- Keepalive-HOWTO / usingkeepalive.html):

  # cat /proc/sys/net/ipv4/tcp_keepalive_time
  7200

  # cat /proc/sys/net/ipv4/tcp_keepalive_intvl
  75

  # cat /proc/sys/net/ipv4/tcp_keepalive_probes
  9

  The first two parameters are expressed in seconds, and the last is
  the pure number. This means that the keepalive routines wait for
  two hours (7200 secs) before sending the first keepalive probe,
  and then resend it every 75 seconds. If no ACK response is
  received for nine consecutive times, the connection is marked as
  broken.

これらの3つのファイルを使用するだけで、echoこれらの値に従って、凍結されたSSHセッションが切断されることを確認できます。


6
sshは最初またはEnterの後のエスケープ文字のみを認識することを追加したいと思います。ssh接続が停止した場合、Enterが頻繁に(常にではないが)以前に押した最後の文字になります。そのためEnter ~ .、接続を終了するシーケンスとして慣れる方がおそらく良いでしょう。
エグモント

ありがとう。私はまだどのようにクリアしておりません/proc/sys/net/ipv4/tcp_keepalive*ファイルやClientAliveIntervalServerAliveInterval 仕事を一緒に?それらはすべて同じ設定、つまりssh接続を維持するためのものですか?前のファイルは、ssh接続だけでなく、他のTCP接続用でもありますか?
ティム

別の質問:なぜ「これらのタイムアウトが非常に大きい場合、凍結したシェルが発生します」。「タイムアウトがかなり高い」とはどういう意味ですか?指定された期間のアクティビティがない場合、シェルは常に凍結されていませんか?または、アクティビティが不足している場合、シェルはフリーズせずに自動的に終了しますか?
ティム

@Tim:1. /proc/sys/net/ipv4/tcp_keepalive*だけでssh(d)なく、リンク先の文書にあるように:Remember that keepalive support, even if configured in the kernel, is not the default behavior in Linux. Programs must request keepalive control for their sockets using the setsockopt interface. There are relatively few programs implementing keepalive, but you can easily add keepalive support for most of them following the instructions explained later in this document.
Arkadiusz Drabczyk

@Tim:2.かなり高いとは、たとえば2時間を意味します。セッションが切断されるまで2時間待つ必要があります。テストを行います-リモートホストに接続し、リモートでキルsshdするか、ケーブルを取り外して、フリーズした sshセッションがいつ終了するかを確認します。frozen shell非アクティブであるI平均殻、任意のキーをとらないと、何も印刷されません。
はArkadiusz Drabczyk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.