2015-11-05 102 views
1

也許您可以幫我解決一個令人沮喪的問題。我無法編譯一個可執行文件,我們稱之爲$$execprob,在我正在測試的Linux主機上編譯它,然後將它編譯到不同的主機上,並將可執行文件移動過來。它運行良好與我的SSH用戶,但是當Web服務器使用雖然權限正確,但Web PHP實例無法運行可執行文件

exec("/home/$$username/usr/local/bin/$$execprob", $output, $return); 

我沒有得到任何$output$return是127,或者找不到文件。

這裏是我的測試的信息列表,可以幫助:

  • 的文件運行正常SSH模式罰款。
  • 通過SSH的權限是-rwxr-xr-x
  • 運行exec('ls -l')的網絡服務器表明,該文件是存在具有相同權限的SSH
  • 在SSH
  • ${USER}是文件所有者$$用戶名
  • 在PHP中:${USER}返回任何
  • 運行exec('if [-x /home/$$username/usr/local/bin/$$execprob]; then echo "thing";fi')打印出「事情';
  • 在SSH運行php -a和進入正常運行exec("/home/$username/usr/local/bin/$$execprob", $output, $return); $$ execprob,與$output顯示輸出和$return == 0,
  • 我在我的.bashrc行正確加載$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;這是必要的可執行文件運行時使用動態庫。我的.bashrc不是由網絡服務器運行;但是,在運行:

exec("export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH; /home/$$username/usr/local/bin/$$execprob", $output, $return);

仍然具有相同的失敗結果。

如果還有其他事情可以爲您收集更多疑難解答信息,請讓我知道。

謝謝!

+1

在您的PHP腳本中,嘗試'print'/ home/$$ username/usr/local/bin/$$ execprob「'以確保它正確解析任何變量名稱。 –

+0

Thanks,@JoelC for thinking about問題。實際上我根本不使用任何變量名。我剛剛在這裏使用這些佔位符來表示我的用戶名和可執行文件名。即。我真的只是在運行'''/ home/jonnybajonny/usr/local/bin/execfilename''',並且這不起作用。 – reor

+1

您能否確保其他人對文件夾鏈中的所有文件夾擁有rx權限?否則,PHP用戶將無法看到要運行的文件。同時檢查你的網絡服務器錯誤日誌,看看有沒有PHP錯誤。 –

回答

0

問題最終被追溯到沒有正確設置$ LD_LIBRARY_PATH環境變量。我有這個行:

exec("export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH; 
    /home/$$username/usr/local/bin/$$execprob", $output, $return); 

然而,當然,(如由@JoelC如上所述,)在export命令的$HOME變量將解析到PHP用戶的$HOME。這是固定使用絕對路徑,例如:

exec("export LD_LIBRARY_PATH=/home/$$username/usr/local/lib:$LD_LIBRARY_PATH; 
    /home/$$username/usr/local/bin/$$execprob", $output, $return); 

值得一提的是,絕對沒有輸出返回,以幫助診斷這一點,這很奇怪。當我從沒有設置$LD_LIBRARY_PATH的shell運行$$execprob時,它會返回關於缺少.so文件的錯誤。爲什麼在這裏輸出的錯誤不會返回?也許系統消息有不同的輸出類別,而不是實際的命令輸出?我想知道是否有辦法在exec()範圍內返回這些類型的消息。

但我想這是另一個帖子的問題...

相關問題