SSH でリモートサーバーにログインすると・・・いっぱいセッション出来る
ssh コマンドでたくさんセッションが出来てしまうのはちょっと無駄が多い気がする。
ssh でサーバにログインしまくってたときの状態 例
ss で ソケットの状態を見ると・・・
takuya@atom:~$ ss State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 192 192.168.12.15:ssh 161.192.74.xx:52555 ESTAB 0 0 192.168.12.15:ssh 161.192.74.xx:52554 ESTAB 0 0 192.168.12.15:ssh 161.192.74.xx:52553
たしかにたくさんだわ。
セッションなんて1つアレばいいんじゃないの?
SSHのログイン済セッションを一つだけ開けておいて、tty 確保やポートフォワードは、そのセッションを共有すれば出来るんじゃないかと思ってた。
ControlMasterを使えば出来るとわかった。
出来るんだろうけど、別に困ってなかったし明示的に調べることもしなかった。
Amazon.co.jp: OpenSSH[実践]入門 (Software Design plus): 川本 安武: 本によると ControlMasterを使えば共有できるとわかった。
早速ヤってみた
.ssh/config に以下のように記述する
Host my-home hostname takuya.example.com controlmaster auto controlpersist 30 controlpath ~/.ssh/controlmaster-%r-%h.%p
するとログインが共有される。
ログインの共有の確認方法
motd を設定していれば、2回目以降のログインで、motd が表示されなくなるので、ひと目で分かる。
実際にログインして状態を見た例
w コマンドでリモートのloginセッション見てみて、3つログインしてることを確認し
takuya@atom:~$ w 02:13:27 up 1 day, 8:01, 3 users, load average: 0.46, 1.21, 1.31 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT takuya pts/1 zaq3dc04a58.zaq. 02:13 17.00s 0.14s 0.14s -bash takuya pts/2 zaq3dc04a58.zaq. 02:13 7.00s 0.15s 0.15s -bash takuya pts/3 zaq3dc04a58.zaq. 02:13 2.00s 0.09s 0.00s w
ss コマンドでリモートのソケットのの状態を見ると・・・
takuya@atom:~$ ss State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 192 192.168.2.5:ssh 161.192.74.xx:52707 takuya@atom:~$
さらに、リモートサーバのプロセスツリーを確認すると
root 3341 0.0 0.0 49936 720 ? Ss 7月12 0:00 /usr/sbin/sshd root 12319 0.0 0.0 92196 4092 ? Ss 02:13 0:00 \_ sshd: takuya [priv] takuya 12331 0.0 0.0 92196 1824 ? S 02:13 0:00 \_ sshd: takuya@pts/1,pts/2,pts/3 takuya 12332 0.1 0.0 21744 4748 pts/1 Ss+ 02:13 0:00 \_ -bash takuya 12457 0.1 0.0 21744 4732 pts/2 Ss+ 02:13 0:00 \_ -bash takuya 12576 0.0 0.0 21744 4848 pts/3 Ss 02:13 0:00 \_ -bash takuya 12857 0.0 0.0 16544 1400 pts/3 R+ 02:15 0:00 \_ ps auxf
このように、一回のログインでソケット確保して複数のログインで共有されていることがわかる。
ワンセッションでpts (psuedo tty )が3つ確保されている。なるほど。
共有は制御用のソケット(ファイル)で実現される
.ssh/config に次のように記述したので、
controlpath ~/.ssh/controlmaster-%r-%h.%p
制御用ソケットファイルが作成されている。
takuya@rena:~$ ls -l .ssh/ total 36 srw------- 1 takuya staff 0 7 14 02:13 controlmaster-takuya-takuya.example.com.22
このファイルが、今回のトリックの種明かしということになる。
この特殊ファイルが手元のローカルマシンに作成され、ここ経由でリモートサーバに複数のPTSの通信をおこなっている。
ウッカリこのファイル読み取られたらやりたい放題されるので、共用サーバでControlMasterを作ったりパーミッションを甘く設定したり、共有ユーザー(あってはいけないことだけど)でソケット作るのも危険ですね。
ControlMasterは開きっぱなしに出来る。
ssh でログインした bashを終了してセッションを閉じたとしても、SSHのコネクションは維持させることが可能で(ContorlPersist設定による)。これにより、ポートフォワードを維持した状態で何度もログインしたりSCPを無駄にセッション作ることを避ける事が出来る。
なんて便利なんでしょう。
やっぱ書籍で情報がまとまるってのは偉大だ。
で、節約してなにが嬉しいの?
私としては次のようなことが嬉しいです。
- ポートフォワード&リモートフォワード
- iTerm2(ターミナル)のウインドウ閉じても大丈夫
- 接続が速い。
- 時間のかかる接続が早くなる
- 多段SSHと組合せたり
- リモート側でtmuxやscreenしなくてイイ場面が出来る
- git をssh 経由だったり
- FUSEでSSHFSマウントしてたり
またサーバー管理者としても
- ユーザごとにssh の接続数を制限しても安心
というメリットもありそうです。
ssh を開きっぱなしにできてると何かと便利ですよね。
でもまぁ、そんなに必要ってわけでもないですけど。
参考書籍
OpenSSH実践入門はいろいろと断片的知識をまとめて整理されてて頭のなかがスッキリしました。感謝です。
この他にも色々なテクニックと設定に関するアレコレが紹介されててオススメです。
Amazon.co.jp: OpenSSH[実践]入門 (Software Design plus): 川本 安武: 本
検索は足りない。
困らないと検索しないし、不満があって時間があるときしか検索して新しい情報を仕入れなくなっている。空いた時間に読んでれば確実に知識が溜まっていく書籍って偉大だよね。
参考資料
OpenSSHのセッションを束ねるControlMasterの使いにくい部分はControlPersistで解決できる - Dマイナー志向