54 ポイント 投稿者 GN⁺ 2026-03-13 | 5件のコメント | WhatsAppで共有
  • SSH セッションがフリーズしたとき、プロセスを強制終了しなくても、SSH に組み込まれたエスケープシーケンスメニューでさまざまな制御が可能
  • セッション内で ↵Enter を入力してから ~? を入力すると、隠しコマンド一覧が表示され、~. でどんな状況でも即座に接続を終了可能
  • このエスケープシーケンスは SSH クライアント自体に組み込まれているため、サーバーや接続が切れている状態でも動作
  • ネストした SSH セッションでは ~~ を使って 内側のクライアントにシーケンスを渡すことが可能
  • さらに -C-v-D などの 便利な SSH オプションもあわせて紹介

SSH エスケープシーケンスメニュー

  • SSH セッション内で ↵Enter を押した後に ~? を入力すると、サポートされているエスケープシーケンス一覧を確認可能
  • 主なシーケンス一覧:
    • ~. — 接続終了(多重化されたセッションを含む)
    • ~B — リモートシステムに BREAK シグナルを送信
    • ~Cコマンドラインを開く(ポートフォワーディング設定可能、help を入力すると案内を確認可能)
    • ~Rrekey 要求
    • ~V/v — verbosity(LogLevel)の増減
    • ~^Z — SSH を一時停止(suspend)
    • ~# — フォワードされた接続一覧を表示
    • ~& — SSH をバックグラウンドに移行(接続終了待ちのとき)
    • ~~ — エスケープ文字そのものを送信(2 回入力)
  • これらのシーケンスは SSH クライアント自体に組み込まれているため、SSH サーバーが応答しない場合や接続が切れた状態でも動作
  • 最も便利なのは ~. で、セッションがフリーズしたときに どんな状況でも即座に終了可能
  • エスケープシーケンスは 改行(newline)の直後にのみ認識される

ネストした SSH セッションでの利用

  • SSH セッション内でさらに SSH 接続した ネスト環境では、~~ を使って内側のクライアントへシーケンスを渡せる
  • 例:
  pinkie@stable:~$ ssh ponyville        # stable  
  pinkie@ponyville:~$ ssh manehatten    # stable › ponyville  
  pinkie@manehatten: ~$                 # stable › ponyville › manehatten  
  pinkie@manehatten:~$ Connection to manehatten closed. # ↵Enter `~~.`  
  pinkie@ponyville:~$                   # stable › ponyville  
  pinkie@ponyville:~$ ssh manehatten stable › ponyville  
  pinkie@manehatten: ~$                 # stable › ponyville › manehatten  
  pinkie@manehatten:~$ Connection to ponyville closed. # ↵Enter `~.`  
  pinkie@stable:~$                      # stable  
  • stable → ponyville → manehatten の順に接続している状態で
  • ~~. を入力すると 最も内側のセッション(manehatten)だけが終了し、ponyville に戻る
  • ~. を入力すると 中間セッション(ponyville)まで終了し、stable に戻る

おまけの SSH オプション

  • ssh -Cgzip 圧縮を有効化。ドキュメント上では高速なネットワークでは不要とされているが、TUI の利用や大量のログ出力時には レイテンシと応答性の改善に大きな効果
  • ssh -v詳細ログを有効化(-vv-vvv でさらに多くの情報を出力可能)。遅い接続や Raspberry Pi のような低速な機器へ接続する際、接続が止まっているのか単に遅いだけなのかの 判別に有用
  • ssh -D 1234localhost:1234SOCKS プロキシを作成。サーバーのネットワーク経由で接続できるため、サーバー側 LAN での作業や 簡易 DIY VPN の用途にも活用可能

5件のコメント

 
t7vonn 2026-03-13

わあ、本当に初めて見る機能ですね。これでもうターミナルを閉じなくてもよさそうです

 
xguru 2026-03-13

わあ……SSHを十数年使ってきて初めて見る機能です。
本当にメニューが出るんですね。

 
bus710 2026-03-13

装置を停止します
えー……

 
GN⁺ 2026-03-13
Hacker Newsの意見
  • 私は manpage を積極的に擁護したいと思っていた。たいていのオープンソースの manpage は品質が高く、中には本当に素晴らしいものもある
    ただし man ツール自体には問題がある。たとえば OpenSSH クライアントの ~? のようなエスケープ構文を探そうとしても、manpage では検索できない
    理由は、man が ~ 文字を妙な Unicode のチルダに変換してしまい、grep できなくなるからだ。- 文字も同様に変換され、検索できなくなる
    これは コマンドラインツールのドキュメント としては致命的だ。こうした変換機能はデフォルトで無効にしておくべきだ

    • 文字変換の問題は知らないが、ctrl-r を押して リテラル検索 できる (/<ctrl-r>~?)
    • Debian のデフォルト pager である less では問題なく動く
    • man -E ascii オプションで解決した。私の環境は Cygwin 3.6.6 なので、ディストリごとの差かもしれない
    • neovim を pager にすると ~? の検索はうまくいく。ただし正規表現のエスケープ (\\~?) を知っている必要がある
    • macOS と CentOS でも \\~\\? の検索は問題なく動く
  • 私は ~. ショートカットは長く使ってきたが、ヘルプメニュー は知らなかった
    ~ を 2 回入力すると実際のチルダ文字を送ることができ、通常のセッションでは先頭文字として入力されない限りエスケープとは認識されない
    つまり、~行の先頭文字であり、改行の直後 にあるときだけエスケープとして動作する。UI 設計がかなり丁寧だ

    • 若い読者向けに説明すると、ターミナルの echo モード ではバックスペースは実際には入力バッファを消さない
      そのため ls ~/^?^?^?^?^?~/a.out のような出力になることがある。SSH は画面ではなく入力ストリームを監視している
    • 欠点は、セッションが固まったときに ~. で終了するには 先に Enter を押さなければならない ことで、これがサーバーに送られる可能性がある
  • 私は SSH を 15 年以上使ってきたが、この エスケープシーケンス は初めて知った
    次にセッションが固まったら ~. をぜひ使ってみるつもりだ。ターミナルを閉じるよりずっといい

    • SSH 接続がよく切れるなら、CGNAT の短い TCP timeout が原因かもしれない
      VPN や Tailscale を使えば解決できるし、そうでなければ tcp_keepalive パラメータを調整して接続を維持できる
      設定例:
      net.ipv4.tcp_keepalive_time=240
      net.ipv4.tcp_keepalive_intvl=60
      net.ipv4.tcp_keepalive_probes=120
      
      こうすると CGNAT 環境でもセッションを維持できる
    • 私は 20 年間、毎週 ~. を使っている。SSH に -v オプションを付けると 接続問題のデバッグ にも役立つ
    • SSH を多段接続しているときは、~~. で 2 番目の hop を終了できる
    • 私もほぼ 30 年近く使っていて、その前は rsh を使っていた。Berkeley r-commands 参照
    • ~. を入力する前には必ず Enter を押して新しい行 から始めなければならない
  • 私も ~. は長く使ってきたが、ほかのエスケープは知らなかった。シェルプロンプトではすぐには効かないので、cat を実行してから ~? を入力する必要がある

    • それでも動作する。OpenSSH は出力ではなく 入力だけを監視 しているので、<enter>~. で終了できる
    • 私もいつも ~. でセッションを切っていたが、~ が新しい行でしか動作しないことは知らなかった。~^Z も便利そうだ
      昔の telnet の ctrl-[ シーケンスを思い出す
    • SSH クライアントはリモートセッションのモードを知らなくてもエスケープを認識する。Enter は単に新しいエスケープ入力を準備する役割を果たしているだけだ
  • こうした機能は実は rsh 由来 のものだ。年配なので覚えている

    • 実際には ~ コマンドスタイルは cu(1) で先に登場した。rsh より前、4.1BSD の時代だ
    • 今では scp を rcp のように使うには -O オプションを付ける必要がある
    • uucp!bangpath の時代を覚えている者としては笑ってしまう
  • SSH のメニューは トンネリング するときに便利だ。今では Tailscale のようなものに置き換えられつつあるが、それでもまだ有用だ

    • 私は新しいタブで「新しい接続」を開くときに ControlMaster 機能を使っている
      複数の SSH セッションを 1 つに 多重化 できるので、認証を繰り返さなくて済み、タブ補完も速くなる
      ただし、接続が固まったときは少し面倒だ
    • 私は tuns.sh をよく使う。localhost を外部に公開できるので便利だ
  • 「秘密」というより、たいていの人が manpage を最後まで読まない のであまり知られていない機能だ

  • ~ エスケープは 1970 年代の UNIX cu でも使われていた。SSH はその子孫と見なせる

  • ControlMaster の設定はデフォルト値が不便なので、次のような設定ブロックを追加するとよい

    Host *
      ControlMaster auto
      ControlPath ~/.ssh/sockets/%r@%h:%p
      ControlPersist 10m
    

    こうすると同じホストへの SSH/scp/rsync が 既存の接続を再利用 する
    ~C エスケープでセッションの途中にポートフォワーディングを追加することもできる

    • ControlPersist を 1 時間くらいまで延ばしておくと、短いログイン間隔でも接続を維持できる
    • このコメントは LLM が書いたみたいだという冗談 もあった
  • 私も SSH セッションが固まったときは [Enter] ~. でしか復旧できなかった
    Linux の専門家でなければあまり知らない 隠れた機能 のようだ

 
kayws426 2026-03-13

知ってはいましたが、あまり使う機会はありませんでした。(...)