SSH でリモートサーバーに接続中、突然キーボード入力が無反応になることがあります。ネットワークの一時的な中断、サーバー側のプロセスがハングアップ、セッションのタイムアウトなどが原因として考えられます。
この状態では exit や Ctrl+D を打っても反応がなく、ターミナルが完全に奪われたように見えます。しかし SSH クライアント自体は動いていることが多く、エスケープシーケンスと呼ばれる特殊な入力を使えば、サーバーからの応答を待たずにクライアント側から強制的に接続を切断できます。
SSH エスケープシーケンスで切断する
SSH には、通常の文字入力とは別に「エスケープシーケンス」という仕組みがあります。行の先頭でチルダ(~)を入力してから特定のキーを打つと、サーバーへの送信をバイパスして SSH クライアント自体を操作できます。
固まった接続から抜け出すには、次の順で入力します。
- Enter を 1 回押す(行頭に移動するため)
~(チルダ)を押す.(ピリオド)を押す
(Enter)~.
Enter を先に押すことが重要です。~ は必ず行頭(改行の直後)にある必要があり、文字入力の途中では認識されません。この操作が成功すると、ターミナルに次のようなメッセージが表示されて接続が切断されます。
Connection to example.com closed.
または以下のように表示される場合もあります。
Killed by signal 1.
このメッセージが出たあとは、元のシェルプロンプトに戻ります。
エスケープシーケンスの種類を確認する
~. 以外にも、SSH エスケープシーケンスにはいくつかの種類があります。~? を使うと対応している一覧を表示できます。
(Enter)~?
実行すると次のような出力が得られます。
Supported escape sequences:
~. - 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
固まった接続から手元の操作を取り戻すだけであれば、~. だけ覚えておけば十分です。
SSH をネストしているときの入力
踏み台サーバー(バスティオンホスト)経由でさらに SSH 接続しているなど、SSH セッションを二重・三重に重ねているケースがあります。この場合、~. は最も外側の接続(手元のターミナルと踏み台の間)に対して作用します。内側の接続を切断したいときは、チルダを重ねて入力します。
- 1 段目(手元 → 踏み台)を切断する:
~. - 2 段目(踏み台 → サーバー)を切断する:
~~.(チルダを 2 つ) - 3 段目の場合:
~~~.(チルダを 3 つ)
ネストが深いほどチルダの数を増やすことで、操作対象の接続層を指定できます。
接続が切断されたことを確認する
元のシェルに戻ったあと、次のコマンドで手元のマシンから張られている TCP コネクションを確認できます。
ss -tn | grep :22
切断した接続のエントリが消えていれば、正常に切断されています。サーバー側の状態を確認したい場合は、別の端末から改めてログインして who や w コマンドで確認する方法があります。
よくあるつまずき
Enter を押さずに ~. と入力してしまう
行の途中で ~. を打っても、SSH はエスケープシーケンスとして認識せず、そのままサーバーに送信しようとします。必ず Enter を一度押して行頭に戻ってから入力してください。
コマンドを入力途中のまま試みてしまう
コマンドを書きかけの状態でも同様に認識されません。Enter で行頭に移動してから再試行してください。
日本語キーボードでチルダの位置が分からない
日本語 JIS キーボードでは、チルダは Shift キーを押しながら ^(へ)キーを押すことで入力できます(環境によって異なる場合があります)。入力できているかどうかを別の場所で試してから操作してください。
入力しても何も起きない
ターミナルエミュレータ(ウィンドウアプリ)自体がハングアップしている場合は、SSH エスケープシーケンスも通りません。そのときはターミナルウィンドウを強制終了し、新しいウィンドウを開いて別途ログインし直す方法があります。ターミナルを閉じるだけでサーバー側のセッションが残ることもありますが、作業の再開は可能です。
接続設定で EscapeChar が変更されている~/.ssh/config や /etc/ssh/ssh_config に EscapeChar none と設定されている場合は、エスケープシーケンス自体が無効化されています。その場合は設定ファイルを確認し、EscapeChar ~(デフォルト値)に戻すか、ターミナルを強制終了する方法をとってください。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
