treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

ファイルサーバに接続中のPCやユーザを確認する

障害などでサーバをメンテナンスするときに、「今、誰が使っている?」を見たい、そんなときどうするかをWindows ServerとLinuxのsambaサーバで確認する方法のご報告です。

発端

緊急時、サーバをシャットダウンや再起動しなきゃいけない状況で、ファイルサーバに接続中のユーザが居ないことを確認してからシャットダウンなり再起動なりを実行して、余計な二次被害を起こさないようにしたい。
※共有フォルダに格納されたファイルを意識せず開いたユーザが、サーバのシャットダウンなどでデータを損失してしまう(あるいは編集中のOfficeファイルに問題が出るかも)という状況を予防したい、という目的です。

Windows Serverだと…

Windows Server(Windows10でも)では「コンピュータの管理(compmgmt.msc)」を使います。
「共有フォルダ」と表記のある箇所を開き、「共有」を開くと、現在共有されているリソースの一覧が表示されます。

f:id:treedown:20210803190128p:plain
ここで「クライアント接続数」が「0」でない共有に接続が来ていると判断出来ます。詳細を見るには「セッション」を開きます。

f:id:treedown:20210803190144p:plain
セッション画面ではユーザ別に開いているファイル/フォルダの数を確認できます。
その下の「開いているファイル」の画面を開くと、

f:id:treedown:20210803190158p:plain
ファイル/フォルダを個別に一覧表示された画面を確認できます。現状開いているファイルのファイル名とそのユーザ名を「アクセス」欄で確認できます。画像では、共有されたD:\配下にある共有フォルダとそのフォルダ内のtest.txtをtestuserというユーザが開いていることが分ります。

sambaサーバ接続確認=コマンド

LinuxのsambaサーバではWindows Serverのようなコンピュータの管理のようなMMCは存在しないので、コマンドで状況確認をすることになります。

使用するコマンドは「smbstatus」コマンドを使います。試したオプションは以下。

-b : 接続情報を簡易表示する
-d : 接続情報を詳細表示する
-S : 接続されている共有の一覧を表示

他に「-L」でロックファイルを表示したり、「-u %username%」で特定のユーザ情報を閲覧可能らしいけど、今回は使っていません。

早速やってみました。

$ smbstatus
smbstatus only works as root!

ん?「smbstatusはrootとしてのみ機能します」と言われてしまいました。ではsudoでコマンドを実行。

==============================================================
$ sudo smbstatus

Samba version 4.5.16-Debian
PID Username Group Machine Protocol Version Encryption Signing
----------------------------------------------------------------------------------------------------------------------------------------

Service pid Machine Connected at Encryption Signing
---------------------------------------------------------------------------------------------

No locked files
==============================================================

おっと、オプションを付け忘れています。やり直し。

==============================================================
$ sudo smbstatus -b

Samba version 4.5.16-Debian
PID Username Group Machine Protocol Version Encryption Signing
----------------------------------------------------------------------------------------------------------------------------------------
240xx nobody nogroup 192.168.xx.xx (ipv4:192.168.xx.xx:519xx) SMB3_11 - -
230xx testuser1 testuser1 192.168.xx.xx (ipv4:192.168.xx.xx:496xx) SMB3_11 - partial(AES-128-CMAC)
225xx nobody nogroup 192.168.xx.xx (ipv4:192.168.xx.xx:497xx) SMB3_11 - -
226xx testuser2 Grp-1 192.168.xx.xx (ipv4:192.168.xx.xx:50436) SMB3_11 - partial(AES-128-CMAC)
224xx nobody nogroup 192.168.xx.xx (ipv4:192.168.xx.xx:555xx) SMB3_11 - -
225xx testuser3 Grp-1 192.168.xx.xx (ipv4:192.168.xx.xx:498xx) SMB3_11 - partial(AES-128-CMAC)
225xx nobody nogroup 192.168.xx.xx (ipv4:192.168.xx.xx:532xx) SMB3_11 - -
==============================================================
※表示は一部書き換えています。

「Username」列に接続しているユーザ名が表示されます。Group列はsambaサーバ上でユーザが所属するグループが表示。
Machine列にユーザ接続元となるPCのIPアドレスが表示されています。nobodyは…、なんだろう。

nobodyの表示を除いて「sudo smbstatus -b | grep -v nobody」で実行すると、ユーザ名をベースに接続の一覧が確認できます。接続数が多いsambaではこの方が見やすいかも。

smbstatusコマンドの詳細表示「-d」

次は「-d」オプションで詳細表示。
==============================================================
$ sudo smbstatus -d

Samba version 4.5.16-Debian
PID Username Group Machine Protocol Version Encryption Signing
----------------------------------------------------------------------------------------------------------------------------------------
93xx testuser1 testuser1 192.168.xx.xx (ipv4:192.168.xx.xx:60348) SMB3_02 - partial(AES-128-CMAC)
95xx testuser2 Grp-1 192.168.xx.xx (ipv4:192.168.xx.xx:51263) SMB3_11 - partial(AES-128-CMAC)
95xx testuser2 Grp-1 192.168.xx.xx (ipv4:192.168.xx.xx:51262) SMB3_11 - partial(AES-128-CMAC)

Service pid Machine Connected at Encryption Signing
---------------------------------------------------------------------------------------------
共有-F1 95xx 192.168.xx.xx 火 8月 3 13時11分04秒 2021 JST - -
共有-F1 93xx 192.168.xx.xx 火 8月 3 13時11分04秒 2021 JST - -
visual-HD 93xx 192.168.xx.xx 火 8月 3 13時11分04秒 2021 JST - -
共有-F1 95xx 192.168.xx.xx 火 8月 3 13時11分09秒 2021 JST - -

Locked files:
Pid Uid DenyMode Access R/W Oplock SharePath Name Time
--------------------------------------------------------------------------------------------------
(中略)
95xx 11xx DENY_NONE 0x100081 RDONLY NONE /home/samba/Share-1 テスト Tue Aug 3 13:11:14 2021
95xx 11xx DENY_NONE 0x100081 RDONLY NONE /home/samba/Share-1 テスト Tue Aug 3 13:11:14 2021
==============================================================
※表示は一部書き換えています。

PIDをベースに、誰がどのフォルダやファイルを開いているかを確認できます。基本的に「-d」オプションさえ使っていれば欲しい情報は一通り閲覧できますが、ユーザの接続数の多いsamba上で「-d」を使うと情報量が多すぎてしまうかも。

PIDが同一の行を見ていけば、冒頭のusername列と真ん中の表示にあるフォルダ一覧の画面を見比べて、どのフォルダを開いているかが分るようです。
これに加えて、一番下の「Locked files:」の表をみれば、ロックファイル=開いているファイルが確認できる、ということのよう。
※恐らく一番下の「Locked files:」の表の表示は「-L」オプションで表示させる一覧と共通なんだと思われます。ただ「-L」で表示させる一覧だとユーザ名や接続元IP等の表示は別の表で照らし合わせる必要があるので、やっぱり「-d」で一通り情報表示した方がいい、という結論に至りました。

その他の情報はまだよく分っていませんが、ひとまずこの方法を覚えておけば、サーバ上で誰が何を開いているかをリアルタイムに確認できるのでメンテナンス時に便利そう。