それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ssh の接続を節約する。ControlMasterを設定する

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マイナー志向