2011-10-19 70 views
3

我需要能够访问一些Windows服务器上的一些共享文件夹使用运行在Linux服务器上的PHP脚本。我只需要获取文件夹中包含的文件的名称以及创建时间的时间戳。从Linux与PHP访问Windows共享文件夹

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

这导致了两个问题。

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

为什么不使用'/ etc/fstab'来启动文件系统? – sarnold

+0

我可以,但我仍然会被困在安装一切手动,这将是一个问题,当我突然有100多个不同的窗口服务器,我需要处理。理想情况下,我希望我的php脚本从我们的服务器库存数据库中读取windows服务器的名称,检查所需文件是否位于该服务器上的正确文件夹中(如果需要,可以通过挂载然后卸载该文件夹,或直接访问该文件夹在服务器上如果可能的话),然后继续下一个。 – Lobo

回答

2

拥有数百台服务器来来往往频率很高,编辑/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

包含usernoauto选项,以便您的脚本可以运行unprivileged,并仍然需要它们时装载共享。

+0

我的一位同事也有一些关于使用smbclient的理论,而你的其他想法非常有用。谢谢。 – Lobo

相关问题