2013-01-21 106 views
2

我試圖在PHP中使用exec(),當通過Web瀏覽器和通過命令行shell使用它時,我得到了不同的結果。PHP exec()通過Web調用CLI CLI

簡單的事情:

<?php exec('mount 10.0.0.1:/mnt/test /home/user/test', $output) ?>

在沒有web瀏覽器導致調用此安裝,並在安裝通過命令行運行它(PHP-CLI)結果被成功執行。 也沒有錯誤被返回到$ output數組。所以我沒有任何要走的路。 我正在將網絡和cli作爲同一用戶運行,因此它不應該是權限問題。 SElinux被禁用,因此不會阻塞任何東西。防火牆也是如此 - 禁用也是如此。

我該如何讓PHP exec()在Web瀏覽器中通過命令行執行相同的操作?

+3

確保用戶名在其下您的Web服務器運行具有足夠的權限。 – 2013-01-21 04:05:36

+0

我幾乎給了該用戶的完全權限。從該用戶的命令行運行相同的PHP腳本,它工作得很好。所以我有點困惑。在Apache中有一個設置可以阻止某些命令嗎?我可以自己運行「掛載」,它通過網絡向我顯示所有當前掛載。通過Web調用該PHP腳本時,無法安裝任何驅動器。 – airtruk

+0

如何以特定用戶身份運行Web腳本? – Joe

回答

0

您只能以根用戶身份掛載分區,可能會將www-data(我假設這是用戶運行apache)添加到sudoers將解決問題,但它會給您帶來一個大的安全漏洞。但是由於您不能寫密碼,因爲它是一項服務,您必須告訴不要向該用戶提供密碼。

添加到您的sudoers文件的底部:

www-data ALL=NOPASSWD: ALL 

,並使用命令

<?php exec('sudo mount 10.0.0.1:/mnt/test /home/user/test', $output) ?> 

顯然,這是一個安全漏洞一樣,沒有其他已去過。

避免這種情況的一種方法可能是使用隊列來放置作業,並使用驗證作業安全的服務進行處理,並在必要時進行掛載。

具有PHP接口

一個很好的隊列beanstalk