我需要能够使用在Linux服务器上运行的php脚本访问许多Windows服务器上的某些共享文件夹。我只需要获取文件夹中包含的文件的名称以及创建它们的时间戳。
到目前为止,我提出的唯一解决方案是在Linux中安装共享并从那里访问它。虽然这解决了这个问题,但我必须以root身份(据我所知)这意味着我要么以root身份运行脚本,这只是简单的愚蠢,或者手动挂载所有共享这将是一个严重的痛苦从长远来看管理。
这导致两个问题。
答案 0 :(得分:2)
有数百台服务器进出频率足够高,编辑/etc/fstab
添加新文件系统肯定是一个烦人的约束。
如果您所做的只是在服务器上列出文件和修改时间,那么smbclient(1)
命令是一个很好的起点。 smbclient(1)
很像SMB和CIFS共享的FTP接口。 -c
命令行选项允许您运行特定命令;类似的东西:
smbclient //$servername/$sharename -c "dir path/to/directory/"
如果您要对文件执行更多操作而不仅仅列出修改时间,那么将共享作为文件系统挂载将减少连接和身份验证请求的数量,并且可能使解析stat(2)
输出变得更加容易而不是解析数据的纯文本表示。
如果您想沿着安装文件系统的路线走下去,请首先拆分脚本。
一小部分应该使用服务器名,共享路径和可选的装载路径;它将(服务器,共享,路径)添加到/etc/fstab
。
这部分可以是setuid root。 (这很危险,但是以root身份运行整个PHP脚本。)
或者,您可以使用acl(5)
支持挂载文件系统并添加新的访问控制条目:
mount / -oremount,acl
setfacl -m www::rw /etc/fstab
现在www
用户有权修改/etc/fstab
文件。 (请注意,在使用ACL为用户提供addmntent(3)
的写入权限时,我实际上没有测试/etc/fstab
。)请务必修改/etc/fstab
以始终挂载/
acl
支持,因此可以重新启动。
您可以使用addmntent(3)
C库函数向/etc/fstab
添加新条目。如果你打算使用setuid root可执行文件,我会选择C语言,而且我可能会用脚本语言选择C,因为addmntent(3)
已经知道如何编写正确格式化的挂载条目/etc/fstab
。
包括user
和noauto
选项,以便您的脚本可以运行非特权,并且仍然可以根据需要安装共享。