从Linux与PHP访问Windows共享文件夹
我需要能够访问一些Windows服务器上的一些共享文件夹使用运行在Linux服务器上的PHP脚本。我只需要获取文件夹中包含的文件的名称以及创建时间的时间戳。从Linux与PHP访问Windows共享文件夹
唯一的解决方案,我想出来的,到目前为止是从那里安装在Linux共享和访问它。虽然这解决了这个问题,但我必须以root身份执行(据我所知),这意味着我必须以root身份运行脚本,这只是简单的愚蠢行为,或者手动挂载所有共享将是一个严重的痛苦从长远来看管理。
这导致了两个问题。
- 有人知道更好的方法吗?如果需要的话,我对所有机器都有管理权限。
- 我必须在这里处理哪些安全问题?我需要克服根本问题,并且我需要保证linux/php脚本不能在windows机器上编辑/删除文件,但我想可能会有比在黑暗中潜伏的问题更多的问题。
拥有数百台服务器来来往往频率很高,编辑/etc/fstab
来添加新的文件系统肯定是一个令人讨厌的约束。
如果你正在做的是在服务器上列出文件和修改时间,那么smbclient(1)
命令是一个很好的起点。 smbclient(1)
很像SMB和CIFS共享的FTP接口。命令行选项-c
可让您运行特定命令;是这样的:
smbclient //$servername/$sharename -c "dir path/to/directory/"
如果你将要与文件比刚刚上市的修改时间做更多,然后安装共享作为文件系统会降低连接和身份验证请求的数目,也许会让解析stat(2)
输出比解析数据的纯文本表示要容易得多。
如果您想遵循安装文件系统的路线,请首先拆分脚本。
一小块应该带一个servername,共享路径和一个可选的安装路径;它将(服务器,共享,路径)添加到/etc/fstab
。
这部分可能是setuid root。 (这是危险的,但拍运行整个PHP脚本作为根。)
或者,你可以用acl(5)
支持挂载文件系统并添加新的访问控制项:
mount/-oremount,acl
setfacl -m www::rw /etc/fstab
现在www
用户修改/etc/fstab
文件的权限。 (请注意,我并没有实际测试addmntent(3)
时的ACL已被用来给/etc/fstab
用户的写权限。)一定要修改/etc/fstab
总是安装/
与acl
支持,所以此工程在重新启动。
可以使用addmntent(3)
C库函数中添加新条目/etc/fstab
。如果你打算使用setuid root可执行文件,我会选择C语言,我可能会选择C语言,因为addmntent(3)
已经知道如何正确地将格式化的装入条目写入/etc/fstab
。
包含user
和noauto
选项,以便您的脚本可以运行unprivileged,并仍然需要它们时装载共享。
我的一位同事也有一些关于使用smbclient的理论,而你的其他想法非常有用。谢谢。 – Lobo
为什么不使用'/ etc/fstab'来启动文件系统? – sarnold
我可以,但我仍然会被困在安装一切手动,这将是一个问题,当我突然有100多个不同的窗口服务器,我需要处理。理想情况下,我希望我的php脚本从我们的服务器库存数据库中读取windows服务器的名称,检查所需文件是否位于该服务器上的正确文件夹中(如果需要,可以通过挂载然后卸载该文件夹,或直接访问该文件夹在服务器上如果可能的话),然后继续下一个。 – Lobo