2012-01-27 76 views
4

我需要從PHP腳本我的臺式機(本地主機)執行kdiff3命令(使用瀏覽器,而不是命令行)。我已經給權限正在執行的腳本來執行kdiff3使用visudo命令用戶www數據。事實上,如果我的身份登錄www數據我可以毫無問題執行它(須藤kdiff3 ...,它的配置爲不輸入密碼要求的話)。如何執行PHP的交互式命令?

問題是當我嘗試從PHP腳本執行此命令。我試過這個:

$output = shell_exec("sudo kdiff3 -m $file.def.old $file $file.def -o $file"); 

並沒有任何反應(輸出爲NULL)。如果我嘗試一個非交互式命令,就像LS它的工作原理:

$output = shell_exec("ls"); 

發生了什麼事?爲什麼不能執行交互式命令?

回答

2

kdiff3是一個交互式的圖形用戶界面程序,因此它使用KDE和Qt和需要X11服務器。

和(對於ApacheLighttpd運行即在PHP)在Web服務器中,你沒有任何的X11服務器。

所以沒有辦法用kdiff3從PHP腳本中(除非該Web服務器正在您的桌面Linux機器上運行;然後你需要設置適當的環境,特別是DISPLAY大概XAUTHORITY環境變量)。但是,您可以運行一個命令行程序,如diff3 ...(使用popen技巧)。

+0

可能是我不應該說「我需要在我的本地主機中執行kdiff3命令」。更好:「我需要在我的桌面機器上執行kdiff3命令」:) – Ivan 2012-01-27 18:14:35

+0

只需將DISPLAY =:0.0添加到/ etc/environment中即可使其正常工作。謝謝! – Ivan 2012-01-27 18:56:14

1

的問題是,sudo正在等待用戶輸入,正如你所說,它是「互動」 - 它要求你輸入密碼。

您可以通過使用proc_open()要執行的命令,並得到獨立的I提供一個/ O流,這樣就可以解析輸出,並在需要時提供密碼。

我所遇到使用的echo "suPassword\n" | sudo cmd這種方式來做到這一點的腳本,但我個人發現這是一個有點碰運氣。

+0

你可以配置'sudo',以便它不要求密碼。 – 2012-01-27 11:39:47

+0

是的,但這對於Web服務器用戶來說是一個非常糟糕的主意,這就是爲什麼我沒有建議它。允許Web服務器用戶有效地執行任何想要的操作都是嚴重問題的祕訣。 – DaveRandom 2012-01-27 11:46:48

+0

同意,但從網絡服務器使用'sudo'和'kdiff3'已經是非常不好的口味...... – 2012-01-27 12:23:48

0

嘗試使用EXEC:

$輸出= EXEC($命令,$ DOM,$回報)

0

每一個交互式命令期望工作標準輸入 - 這是不是與shell_exec();

使用給定popen()和朋友或重定向來自文件的輸入。你可能仍然是出於運氣,如果有問題的文件檢查ISATTY

7

嘗試passthru($cmd);

它將允許用戶在終端屏幕上的I/O。