2012-03-31 440 views
3

我正在使用arch linux。我想執行更改系統ip的php文件。我做了在arch linux中以root用戶身份執行命令

ifconfig eth0 192.168.163.137 

在終端,它工作正常。同樣我想在一個PHP文件與

shell_exec('ifconfig eth0 192.168.163.137'); 

做,並試圖從位於遠程的Web瀏覽器從通過路由器連接的另一臺電腦打開該網頁。該頁面不顯示任何內容,代碼也不會執行。我猜它是用戶執行它的問題.apache正在執行它。所以我希望它由root.can運行任何人請指導我執行我的代碼。我甚至安裝須藤,只是把

shell_exec('sudo ifconfig......'); 

太犯規執行......請幫助... thanku .. :)

+0

調試的一個好方法是回顯函數的返回值。總是有幫助。該函數本身不會寫入輸出緩衝區。 – animuson 2012-03-31 20:05:58

+0

試圖做...它不返回任何東西。只有在配置完成後才使用shell_exec('ifconfig');並返回值回顯,那麼我得到的網頁上的完整文本,文本是顯示在終端上的文本 – 2012-03-31 20:17:44

+0

只是告訴我如何作爲根執行.. – 2012-03-31 20:21:09

回答

3

Sudo通常需要交互式shell才能輸入密碼。這顯然不會發生在PHP腳本中。如果您確定自己知道自己在做什麼,並且已經覆蓋了安全問題,請嘗試允許Apache用戶在沒有密碼的情況下運行sudo,但僅限於某些命令。

例如,在sudoers文件中添加以下行將允許Apache在沒有密碼的情況下運行sudo,僅用於ifconfig命令。

apache ALL=NOPASSWD: /sbin/ifconfig 

調整路徑並添加任何參數以滿足您的需求。

注意:

  • 還有可能是由於PHP調用shell命令的方式併發症。
  • 請記住,允許Web服務器以root身份運行命令是非常危險的!

可能是一個更好的選擇:

  • 寫有suid位shell腳本,使它以root運行不管是誰調用它。
+3

擴大到這一點。每分鐘都有一個bash腳本作爲cron作業運行。所以,當你想改變IP時,你的web服務器會改變一個文本文件或者insterts到數據庫中。 bash腳本檢查這個並執行ifconfig命令。所以你的web服務器沒有root權限。 – David 2012-03-31 20:36:18

+2

setuid將不能在shell腳本上工作。大衛的解決方案比sudo更好。 – strkol 2012-03-31 20:38:40

+0

@strkol黨,忘記了。謝謝。 – kijin 2012-03-31 20:42:02

0

將命令寫入隊列並讓cron選取它們,驗證它們(只允許已知的良好請求)並運行它們,然後用該日期和結果標記該隊列。

您的最終用戶可以使用ajax點擊/等待更新。

相關問題