列出共享文件夹中打开的文件

列出共享文件夹中打开的文件

我的网络上有一个运行 Debian Jessie 8.7 的文件服务器,带有 Samba 4.2.14。

到目前为止,我只为整个网络配置了一个共享文件夹,我想查看该共享上是否有打开的文件。


  • 运行时smbstatus -L,它不会指出任何有关任何打开文件或者锁定文件

    $  smbstatus -L
    Registered MSG_REQ_POOL_USAGE
    Registered MSG_REQ_DMALLOC_MARK and LOG_CHANGED
    No locked files
    
  • 使用lsof,它只会给我有关在服务器的本地文件系统上哪个进程正在使用共享文件夹的信息。

    $ lsof | grep backup
    smbd      1432      root  cwd    DIR     8,9     4096       2 /backup/local
    
  • 此外使用fuser,它没有提供任何信息打开文件或者锁定文件。它仅显示使用服务器本地文件系统上的共享文件夹的 sPID。

    $ fuser /backup/local
    /backup/local:  1432c
    

还有一些其他选项可以跟踪打开的文件,例如:

  • 使用 Shellscript 列出所有带有以下扩展名的文件.doc、.docx、.xls、.xlsx等等,并if [ -f ".~lock.new_document.docx#" ] ; then为了定义是否打开了 Microsoft Office 文件而进行,但这种解决方法不是我想要的。

  • 使用VFS 模块用于审计共享文件夹内任何文件的操作都可以作为 Shellscript 的来源,但这并不实际。


是否有人可能知道任何可以列出 Samba 共享文件夹中打开/锁定的文件的工具,因为这smbstatus -L似乎不是解决这个问题的选项?

答案1

根据我的研究结果,得益于VFS 模块,Samba 不会为正在共享和使用的文件保留文件描述符,无论是哪种普通文件,只有一种例外。

我发现打开的文件可通过lsof或看到的唯一情况smbstatus -L是当您从微软 Office 2010向前。

$ lsof | grep bkp
bash      1272      root  cwd       DIR      8,9         4096     651521 /bkp/local/John
smbd      2492      root  cwd       DIR      8,9         4096          2 /bkp/local
smbd      6127      root  cwd       DIR      8,9         4096          2 /bkp/local
smbd      6127      root   35r      DIR      8,9         4096     651521 /bkp/local/John
smbd      6127      root   36r      DIR      8,9         4096          2 /bkp/local
smbd      6127      root   37r      DIR      8,9         4096          2 /bkp/local
smbd      6127      root   38r      DIR      8,9         4096          2 /bkp/local
smbd      6127      root   41r      DIR      8,9         4096          2 /bkp/local
smbd      6127      root   42r      DIR      8,9         4096     651521 /bkp/local/John
smbd      6127      root   44uR     REG      8,9            0     651529 /bkp/local/John/word_john.docx
lsof      6345      root  cwd       DIR      8,9         4096     651521 /bkp/local/John
grep      6346      root  cwd       DIR      8,9         4096     651521 /bkp/local/John
lsof      6347      root  cwd       DIR      8,9         4096     651521 /bkp/local/John


$ smbstatus -L
Registered MSG_REQ_POOL_USAGE
Registered MSG_REQ_DMALLOC_MARK and LOG_CHANGED
Locked files:

Pid    Uid    DenyMode  Access      R/W      Oplock     SharePath     Name                     Time

6127         1001       DENY_NONE  0x100081    RDONLY     NONE        /respaldo/segeco_local   .   Tue May 30 14:10:14 2017
6127         1001       DENY_NONE  0x100081    RDONLY     NONE        /respaldo/segeco_local   .   Tue May 30 14:10:14 2017
6127         1001       DENY_NONE  0x100081    RDONLY     NONE        /respaldo/segeco_local   .   Tue May 30 14:10:14 2017
6127         1001       DENY_WRITE 0x12019f    RDWR       LEVEL_II    /respaldo/segeco_local   Susana/word_susana.docx   Tue May 30 14:10:38 
2017
6127         1001       DENY_NONE  0x100081    RDONLY     NONE        /respaldo/segeco_local   Susana   Tue May 30 14:14:25 2017
6127         1001       DENY_NONE  0x100081    RDONLY     NONE        /respaldo/segeco_local   Susana   Tue May 30 14:14:25 2017

例如,当您通过以下方式打开 .docx 文件时,不会发生同样的情况:微软 Office 2007或者LibreOffice 4


通常会发生什么(忘记上面有关 Microsoft Office 2010 及更高版本的文件的情况):一旦客户端计算机打开 Samba 维护的共享文件夹中的文件,该文件就会缓存在客户端计算机的文件系统中,并在服务器的文件系统中关闭。

下面,我描述了我在实验过程中注意到的一些现象Samba 的 VFS 模块

此功能的配置允许审核对每个共享文件夹执行的操作,在我的答案的末尾进行了描述。


对于文本文档、图像、PDF、媒体文件,客户端计算机

  • 打开文件
  • 缓存数据
  • 关闭本地文件系统上的文件服务器
  • 保存修改时,桑巴在上创建一个临时文件服务器
  • 关闭文件时,桑巴删除原始文件并将 tmp 文件重命名为原始文件的名称。

在客户端上打开文件

May 30 11:13:02 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|r|Expedientes.txt
May 30 11:13:02 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/Expedientes.txt

保存文件

May 30 11:16:52 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|w|~gvfPvwn.tmp
May 30 11:16:52 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|pwrite|ok|John/~gvfPvwn.tmp
May 30 11:16:52 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/~gvfPvwn.tmp
May 30 11:16:52 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|unlink|ok|John/Expedientes.txt
May 30 11:16:52 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|rename|ok|John/~gvfPvwn.tmp|John/Expedientes.txt

关闭文件

Samba 不会记录客户端机器上关闭的文件的操作。


对于 Microsoft Office 文件(.docx、.doc、.xls、.xlsx 等),客户端计算机

  • 打开文件
  • 缓存数据
  • 关闭本地文件系统上的文件服务器
  • 打开 tmp/lock 文件 (.~lock.my_word_document.docx#) 并将其关闭
  • 插入的每个字节客户端计算机,在原始文件上生成打开/关闭操作
  • 保存文件时,客户端计算机将修改写入文件
  • 关闭文件时,桑巴删除 tmp/lock 文件

在客户端上打开文件

May 30 11:22:14 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|w|Desktop Word John.docx
May 30 11:22:14 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/Desktop Word John.docx
May 30 11:22:14 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|r|Desktop Word John.docx
May 30 11:22:14 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|w|.~lock.Desktop Word John.docx#
May 30 11:22:14 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/.~lock.Desktop Word John.docx#

将数据写入文件(每个写入的字节都会生成 OPEN/CLOSE 操作)

May 30 11:22:44 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|r|Desktop Word John.docx
May 30 11:22:44 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/Desktop Word John.docx
May 30 11:22:44 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|r|Desktop Word John.docx
May 30 11:22:44 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/Desktop Word John.docx
May 30 11:22:45 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|r|Desktop Word John.docx
May 30 11:22:45 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/Desktop Word John.docx

保存文件

May 30 11:26:33 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|w|.~lock.Desktop Word John.docx#
May 30 11:26:33 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|pwrite|ok|John/.~lock.Desktop Word John.docx#
May 30 11:26:33 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/.~lock.Desktop Word John.docx#
May 30 11:26:33 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|r|Desktop Word John.docx
May 30 11:26:33 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/Desktop Word John.docx
May 30 11:26:33 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|w|Desktop Word John.docx

关闭文件

May 30 11:37:39 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|open|ok|r|.~lock.Desktop Word John.docx#
May 30 11:37:39 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|close|ok|John/.~lock.Desktop Word John.docx#
May 30 11:37:39 server001 smbd_audit: normal.user|192.168.1.67|win7pc|serversharedfolder|unlink|ok|John/.~lock.Desktop Word John.docx#

如果你计划实施Samba 的 VFS 模块,这里有一些链接可以指导您完成设置(不要忘记安装包samba-vfs-modules):

以下是摘录的一部分smb.conf,展示了特定共享文件夹的功能设置:

...
[fileserver]
path = /bkp/local
valid users = john, jane, martin, carl
force group = sambashare
create mode = 0660
directory mode = 0770
available = yes
read only = no
writable = yes
browsable = yes
hide files = /lost+found/ 
vfs objects = full_audit
full_audit:prefix = %u|%I|%m|%S
full_audit:success = mkdir rename rmdir pwrite write unlink open close
full_audit:failure = mkdir rename rmdir pwrite write unlink open close
full_audit:facility = local7
full_audit:priority = warning
...

不要忘记添加一条语句,rsyslog以便将共享文件夹中的数据生成到日志文件中:

$ grep local7 /etc/rsyslog.conf 
local7.*            /var/log/samba/audit.log

相关内容