2015-04-14 29 views
1

我試圖使用防病毒掃描上傳到我的網站的文件。PHP中的系統()命令得到的值回顯

$esetRes = system('C:\\"Program Files"\\ESET\\"ESET NOD32 Antivirus"\\ecls.exe '.$fileName, $retval); 

「系統」的命令回聲的詳細結果到我的網頁,但這些結果在$ esetRes變量不返回

ECLS命令行掃描儀,版本8.0.312.0( C)1992-2015 ESET, spol。 s r.o.模塊加載器,版本1056(20150113),版本1082模塊 perseus版本1452(20150331),版本1682模塊掃描器版本 11471(20150414),版本23373模塊存檔器版本1223 (20150323),版本1220模塊advheur,版本1154(20150129),建立 1120模塊清潔器,版本1107(20150401),建立1138

命令行:上傳/ aXpWo46_700b.jpg

掃描開始時間:15年4月14日12時04分48秒

掃描完成時間:04/14/15 12:04:48掃描時間:0秒 (0:00:00)合計:文件 - 1,對象1感染:
文件 - 0,對象0清理:文件 - 0,反對0

有沒有辦法讓這些結果反饋,並將其存儲在一個變量,所以我可以將它們存儲在數據庫中?

+0

使用'EXEC()'代替'系統()' 。 – kba

回答

0

我能夠通過使用了shell_exec(獲取輸出),而不是系統()

$esetRes = shell_exec('C:\\"Program Files"\\ESET\\"ESET NOD32 Antivirus"\\ecls.exe '.$fileName) ; 
2

http://php.net/manual/es/function.system.php

說:

這是針對Windows用戶。我正在運行Apache,現在我已經嘗試了好幾個小時來捕獲命令的輸出。

我試過這裏寫的所有東西,然後繼續在網上搜索,沒有運氣。該命令的輸出從未被捕獲。我得到的只是一個空陣列。

最後,我在一個博客中發現了一個可以解決我的問題的驚人人的評論。

將字符串2>&1添加到命令名最後返回輸出!這在PHP中使用exec()以及system(),因爲它使用流重定向將輸出重定向到正確的位置!

system("yourCommandName 2>&1",$output) ;

1

首先!如果要將變量插入到shell命令中,請使用escapeshellarg()來防止shell命令注入!你不想讓病毒掃描器成爲後門,不是嗎?


關於這個問題,它看起來像程序輸出的詳細信息stderr。您需要使用2>&1將其重定向到stdout

$fileNameArg = escapeshellarg($filename); 
$esetRes = system('C:\\"Program Files"\\ESET\\"ESET NOD32 Antivirus"\\ecls.exe '. $fileNameArg . ' 2>&1', $retval); 

檢查:https://support.microsoft.com/en-us/kb/110930/