2011-10-19 69 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

相關問題