使用php从linux访问windows共享文件夹


Access windows shared folders from linux with php

我需要能够使用在Linux服务器上运行的php脚本访问一些windows服务器上的共享文件夹。我只需要得到文件夹中包含的文件的名称和创建时间戳。

到目前为止,我想到的唯一解决方案是在Linux中挂载共享并从那里访问它。虽然这解决了问题,但我必须以root身份执行(据我所知),这意味着我必须以root身份运行脚本,这只是愚蠢的,或者手动挂载所有共享,这将是一个严重的痛苦,从长远来看管理。

这就引出了两个问题。

    有谁知道更好的方法吗?如果需要,我拥有所有机器的管理权限。
  1. 我在这里需要处理哪些安全问题?我需要克服根本问题,我需要保证linux/php脚本不能在windows机器上编辑/删除文件,但我猜可能有比那些潜伏在黑暗中的问题更多的问题。

几百台服务器频繁地来来往往,编辑/etc/fstab以添加新的文件系统绝对是一个令人讨厌的约束。

如果您所做的只是列出服务器上的文件和修改时间,那么smbclient(1)命令是一个很好的起点。smbclient(1)很像SMB和CIFS共享的FTP接口。-c命令行选项允许您运行特定的命令;比如:

smbclient //$servername/$sharename -c "dir path/to/directory/"

如果您打算对文件做更多的事情,而不仅仅是列出修改次数,那么将共享挂载为文件系统将减少连接和身份验证请求的数量,并且可能使解析stat(2)输出比解析数据的纯文本表示容易得多。

如果您想挂载文件系统,首先拆分您的脚本。

一小部分应该包含服务器名、共享路径和可选的挂载路径;它将(服务器,共享,路径)添加到/etc/fstab

这部分可以设置为root。(这很危险,但总比以root身份运行整个PHP脚本要好。)

或者,您可以挂载具有acl(5)支持的文件系统,并添加一个新的访问控制项:

mount / -oremount,acl
setfacl -m www::rw /etc/fstab

现在www用户拥有修改/etc/fstab文件的权限。(请注意,当使用acl为用户提供对/etc/fstab的写访问权限时,我还没有实际测试addmntent(3)。)一定要修改/etc/fstab,使其始终在支持acl的情况下挂载/,这样在重启时都能正常工作。

您可以使用addmntent(3) C库函数向/etc/fstab添加新条目。如果您要使用setuid根可执行文件,我会选择C而不是脚本语言,而且我可能会选择C而不是脚本语言,因为addmntent(3)已经知道如何将格式正确的挂载条目写入/etc/fstab

包含usernoauto选项,这样您的脚本可以在没有特权的情况下运行,并且仍然可以在需要时挂载共享。