SSH接続が切断されたときにコンソールが永久にハングすることがあるのはなぜですか?


89

私はこれを非常に多くのコンソール(Linux、Macなど)で、そして多くの異なるネットワークの多くの異なるマシンで見ました。これが起こる正確な理由を特定することはできません。SSH経由でマシンにログインするだけです。何らかの理由で接続が切断された場合(簡単にするために、ネットワークケーブルが引っ張られたとしましょう)、コンソールが永久にハングする場合があります-または、親シェルに問題なく終了する場合もあります。

これが起こるととても面倒です(たとえば、コマンド履歴が失われます。)強制終了する可能性のある秘密のキーボードショートカットはありますか(Ctrl-CまたはCtrl-Dは機能しません)。とにかく、すべての実装でこのランダムな「バグ」が発生する理由は何ですか?


このスレッドは、ローミング(IPの変更)などを含む接続障害に対処するMosh(モバイルシェル)に言及するのに適しているようです。
シプリアンTomoiagă

回答:


137

終了を強制する「秘密の」キーボードショートカットがあります:〜)凍結されたセッションから、これらのキーを順番に押しますEnter~.。チルダ(改行の後のみ)は、sshクライアントによってエスケープシーケンスとして認識され、ピリオドは苦労せずにビジネスを終了するクライアント。

通信の問題に対する長いハングの動作はバグではありません。SSHセッションは、相手が戻ってくることを期待してハングアウトしています。ネットワークが切断された場合、時には数日後でもSSHセッションを取り戻すことができます。もちろん、あきらめて、上記のシーケンスで死ぬように具体的に伝えることができます。クライアントにキープアライブタイムアウトを設定するなど、さまざまなことができます。これにより、一定時間アクティブリンクがない場合、自動的にシャットダウンしますが、デフォルトの動作はそのままです。可能な限り接続!

編集:この割り込みキーのもう1つの便利なアプリケーションは、ローカルsshクライアントの注意を引き、バックグラウンドで1分間ローカルシェルに戻ります(たとえば、履歴から何かを取得する)。Enter~ Ctrl+ Zを使用してsshクライアントをローカルシェルのバックグラウンドジョブキューに送信してから、fg通常どおりに戻します。

編集:ネストされたSSHセッションを処理する場合、複数のチルダ文字を追加して、チェーン内のSSHセッションの1つだけをブレークアウトし、残りを保持することができます。あなたは3つのレベルにネストされている場合たとえば、(つまり、あなたは> machine3にローカルから> Machine1-> Machine2-からSSH) Enter~.、バックあなたのローカルセッションにあなたを取得するEnter~~.のMachine1であなたを残すだろう、とEnter~~~.MACHINE2であなたを残します。これは、sshセッションを一時的にバックグラウンドに移動するなど、他のエスケープシーケンスでも機能します。上記は、ティルドを追加するだけで、あらゆるレベルのネストに機能します。

最後に、使用Enter~?して、使用可能なエスケープコマンドのヘルプメニューを印刷できます。

TL; DR-サポートされるエスケープコマンドはサポートされるエスケープシーケンスです。

 ~.   - terminate connection (and any multiplexed sessions)
 ~B   - send a BREAK to the remote system
 ~C   - open a command line
 ~R   - request rekey
 ~V/v - decrease/increase verbosity (LogLevel)
 ~^Z  - suspend ssh
 ~#   - list forwarded connections
 ~&   - background ssh (when waiting for connections to terminate)
 ~?   - this message
 ~~   - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

11
頭の中でsshdを撃つためのdodecatouple-secret-probationパスワードを知っているため+1。私がやったのと同じ方法でそれを知りましたか(~/.somethingorotherEnterを押した後のミスタイプ)?
voretaq7

2
@ voretaq7:いいえ、私はそれほど賢くありませんでしたが、誰かが私に手がかりをくれたとき、「本当に?。それは、あなたが言及したもののタイプミスを除いて、一般的なシーケンスではありませんが、起こる可能性があります。
カレブ

14
これにより、「秘密」とは「manページ」を意味します。
ラースク

4
多くの人はこれについて知らないが、それは本当に明白な秘密である。セクションのman ssh下でこれをカバーしESCAPE CHARACTERSます。~.(切断)と~^Z(バックグラウンドssh)は非常に便利です。
ステファンLasiewski

9
もちろん、それはmanページにあります:) OPがしたので、私はsecretという単語のみを使用し、頬に舌を使用していました。この機能の問題は、人々がそれを探す場所を知らないことであり、制御文字とそのような信号がシェルなどの一部であると期待することです。どこを見るべきか、何を尋ねるべきかさえわかったら、もちろんそこにあります。
カレブ

12

SSHはキープアライブ機能を提供します。次をローカルに追加します~/.ssh/config(存在しない場合は作成します):

ServerAliveInterval 15
ServerAliveCount 3

この設定は、安全なトンネルを介して15秒ごとに送信されるキープアライブ信号を確立します。3回連続して失敗すると、SSHクライアントは終了します。

一部のシステム(macOS 10.14を含む)では、代わりに次のようにする必要があることに注意してください。

ServerAliveInterval 15
ServerAliveCountMax 3

ask.ubuntuのこの回答から:https ://askubuntu.com/a/29967/30266


9

ハングするという事実は、SSHではなくTCPの機能です。TCPが接続を使用してアプリケーションに接続が存在しないことを通知しない限り、アプリケーションにはTCPセッション/接続が切断されたことを知る方法がありません。各ホストの観点から見ると、TCPセッションはまだ確立された状態にあり、RST(TCPキープアライブパケットに対する応答の欠如)以外の長いアイドル(データフローなし)セッションが無効であることを言うことはありません普遍的に実装されていません)。それは私にはSSHのバグではないようです、私はその動作を期待しています。


5

接続が適切にハングした場合、キーを押す前に接続がすでにハングしているため、魔法のキーストロークは通過しません。クライアントに終了するように指示することはできますが、これはサーバー側で保持される(またはされない)履歴には影響しません。

これは実際には質問に答えていませんが、接続のハングの影響を減らすのに役立つ可能性があります:リモートで作業しているとき(そして通常はそうでないときでも)私は走りますscreenbyobu可用性に応じてラッパーの有無にかかわらず)何らかの種類の接続ドロップがある場合、すべての履歴を含むセッションが保持され、再接続時に残した状態で利用できます。


6
画面についての提案は問題ありませんが、最初のビットは実際には問題に当てはまりません。リモート側にキーを取得する必要はありません。LOCALsshクライアントにキーを取得するだけです!OPは、歴史を含めて彼の地元のシェルバックを望んでいます。SSHはそれを引き継ぎ、CTRL-Cのような通常のブレークシーケンスに応答しません。ローカルクライアントを通過して終了する方法があります。私の答えをご覧ください。シェルの構成に応じて、ローカルエンドの履歴は通常、再度ログインしても保持されます。
カレブ

2
@Caleb:履歴を失うことに特に言及した質問であり、コマンド履歴はサーバー側に保存されます。サーバーに履歴に対して異なることを行うように指示するには、サーバーに対してメッセージを取得して、履歴に対して異なることを行うように指示する必要があります。もちろん、bashのを作る方法(およびいくつかの他のシェル)の記録履歴行すぐにではなく、ユーザが適切とシェルが存在するまで、RAMにそれらを集める存在exit/ logout使用せずに歴史問題を解決するだろうscreen
デビッドスピレット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.