获取PHP中的system()命令回显的值

时间:2015-04-14 10:48:53

标签: php

我正在尝试使用防病毒扫描上传到我网站的文件。

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

'system'命令将详细结果回显到我的网页,但这些结果不会在$ esetRes变量中返回

  

ECLS命令行扫描程序,版本8.0.312.0,(C)1992-2015 ESET,   SPOL。 s r.o.模块加载器,版本1056(20150113),构建1082模块   perseus,版本1452(20150331),build 1682模块扫描仪,版本   11471(20150414),build 23373 Module archiver,版本1223   (20150323),build 1220 Module advheur,version 1154(20150129),build   1120模块清洁器,版本1107(20150401),版本1138

     

命令行:uploads / aXpWo46_700b.jpg

     

扫描开始于:2015年4月14日12:04:48

     

扫描完成于:2015年4月14日12:04:48扫描时间:0秒   (0:00:00)总计:文件 - 1,对象1感染:
  files - 0,objects 0 Cleaned:files - 0,objects 0

有没有办法将这些结果返回并存储在变量中,以便将它们存储在数据库中?

3 个答案:

答案 0 :(得分:2)

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

表示:

这适用于WINDOWS用户。我正在运行Apache,我现在已经尝试了几个小时来捕获命令的输出。

我尝试了所有写在这里的内容,然后继续在线搜索,没有运气。从未捕获过该命令的输出。我得到的只是一个空阵列。

最后,我在某个博客中发现了一个解决我的问题的惊人的评论。

将字符串2>&1添加到命令名称最终返回输出!!这适用于exec()以及PHP中的system(),因为它使用流重定向将输出重定向到正确的位置!

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

答案 1 :(得分:1)

第一!如果要将变量插入shell命令,请使用escapeshellarg()来防止shell命令注入!您不希望病毒扫描程序成为后门,不是吗?


关于问题,程序似乎将详细信息输出到stderr。您需要使用stdout将其重定向到2>&1

$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/

答案 2 :(得分:0)

我能够通过使用shell_exec()而不是system()

来获取输出
$esetRes = shell_exec('C:\\"Program Files"\\ESET\\"ESET NOD32 Antivirus"\\ecls.exe '.$fileName) ;