opensshの豆知識

opensshクライアントからssh接続しているとき、「ローカルホストへ実行中のsshコマンド」へ指示を出すことができる。たとえばssh接続自体を切断して、手元のマシンに戻ることができる。リモートサーバが無反応になってしまった場合に使う。

opensshは、改行直後に以下のキーシーケンスを受け付ける。

~. ssh接続の強制的な切断
~C port-forwardの追加
~^z ローカルのsshコマンドをバックグラウンドに移行
~# forward中のコネクションの一覧を表示
~& sshコマンドをバックグラウンドに移行(forwarding中のトンネルが終了次第、sshコネクションを切断し終了)
~? このヘルプを表示する
~~ 「~」キー自体を出力

sshコマンドでの接続先において、改行直後に「~」を入力してもすぐに画面に表示されない*1理由は、このキーシーケンスがあるから。このキーシーケンスにない文字を入力した時点で、纏めてリモートへ送信される。

「~.」は、特にいうことなし。ssh接続をぶったぎって強制的に終了させるだけ。

「~^z」はssh接続をバックグラウンドに移行して、ローカルでコマンドを実行した後にフォアグラウンドに戻るための機能。忘れられがちだが、sshコマンドそれ自体もforegroundとbackgroundに移行できるコマンドです*2。注意点は、ここでの「^z」は、Ctrl-zなこと。加えて、-e^zzをコマンドキーとしているGNU Screenの中からこれをやる場合には、「~^z^z」として、エスケープを重ねる必要がある。

「~?」はコマンドを思い出せなくとも、これさえ覚えておけば後は、その場で確認できるので必須。

「^C」。Cは大文字なので注意。こいつはその場でsshのport forwardingを設定するコマンド。以下のように使う。

[hogehoge@hostA ~]$
ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -KR[bind_address:]port                 Cancel remote forward

[hogehoge@hostA ~]$
[hogehoge@hostA ~]$
ssh> -L1052:localhost:22
Forwarding port.

このとき設定したport forwardingによるトンネル経由で張られているコネクションの一覧を表示するには、「~#」を使う。

[hogehoge@hostA ~]$ ~#
The following connections are open:
  #0 client-session (t4 r0 i0/0 o0/0 fd 4/5 cfd -1)
  #5 direct-tcpip: listening port 1500 for localhost port 22, connect from 127.0.0.1 port 59538 (t4 r1 i0/0 o0/0 fd 11/11 cfd -1)

#5のdirect-tcpipがforwarding中のコネクションを示している。このコネクションを張ったまま、「~&」でsshをbackgroundに移行させると、シェル自体は終了するがport-forwarding自体はそのまま維持する。forwarding中のコネクションが全て無くなると自動的に終了する。残念ながら、port-forwardの設定自体の一覧は出せないように見える。

ただ、昨今はWindowsなマシンからPuTTYなりのターミナルエミュレータで接続することが多いのであまり使う機会そのものがなくなりつつあるようにも思う。

*1:リモートサーバにすら送信されていない

*2:最もコネクションの関係があるので、あまり実用的/セキュリティ的に好ましいとは思わない