我正在尝试使用防病毒扫描上传到我网站的文件。
$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
有没有办法将这些结果返回并存储在变量中,以便将它们存储在数据库中?
答案 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);
答案 2 :(得分:0)
我能够通过使用shell_exec()而不是system()
来获取输出$esetRes = shell_exec('C:\\"Program Files"\\ESET\\"ESET NOD32 Antivirus"\\ecls.exe '.$fileName) ;