2011-12-30 117 views
1

出於好奇,這裏發生了什麼?什麼是這個PHP exec()的字符串與變量結果的解釋?

要麼我真的很累,要麼我看到的唯一區別是第二個exec使用一個字符串,而前一個使用同一個字符串的變量。

//代碼

$command = "sudo /bin/mount /dev/sdd1 /a 2>&1"; 
    echo "[mountDev] command=$command\n"; 
    exec($command,$ouput,$ret_val); 
    debugArr("mountDev",$output,$ret_val); 

    $new_command="sudo /bin/mount /dev/sdd1 /a 2>&1"; 
    echo "[mountDev] comman2=$new_command\n"; 
    exec("sudo /bin/mount /dev/sdd1 /a 2>&1",$output,$ret_val); 
    // error handling 
    debugArr("mountDe2",$output,$ret_val); 

//輸出

[mountDev] device=/dev/sdd1 
[mountDev] command=sudo /bin/mount /dev/sdd1 /a 2>&1 
[mountDev] output= 
[mountDev] retval=32 
[mountDev] comman2=sudo /bin/mount /dev/sdd1 /a 2>&1 
[mountDe2] output=Array 
(
    [0] => mount: you must specify the filesystem type 
) 
[mountDe2] retval=32 
+1

這些是一個接一個地運行嗎?如果你嘗試掛載一個已經掛載的分區,我認爲'mount'會給出一個錯誤(雖然不一定是那個)。 – 2011-12-30 20:12:34

+0

要修正'你必須指定文件系統類型'錯誤,你應該在'mount'後加'-t '。 – 2011-12-30 20:21:01

+0

是的,我知道這一點。我試圖在用戶嘗試裝入沒有文件系統的驅動器時執行錯誤處理部分,該文件系統會回覆您的第一條評論,因爲此「安裝」命令完全不起作用,因爲「測試」磁盤沒有文件系統 – 2011-12-30 20:32:04

回答

3
錯誤

exec($command,$ouput,$ret_val);。您錯過了outputt。 :P

你確實有2個選項,

  1. 其更好地使用proc_openexec。因爲您不必添加那些2>&1來捕獲stderr

  2. 此外,您在exec中使用sudo。這意味着如果運行php文件的用戶必須在/etc/sudoers文件中。最好使用爲您運行命令的root特權守護程序,併爲您提供輸出。您需要實現進程間通信。

+0

...哇,我什至沒有注意到, – 2011-12-30 20:19:36

+0

這樣做。我認爲我應該完成一天hahaha – 2011-12-30 20:33:06

+0

如果我的目標是確保只有一個用戶可以執行該命令,那麼exec是正確的選擇?我的sudoers文件被修改爲... – 2011-12-30 20:35:41

相關問題