我有这个命令:
exec(sprintf('%s %s dump_data output', escapeshellarg($apps . 'pdftk' . DIRECTORY_SEPARATOR . 'pdftk.exe'), escapeshellarg(self::winEscapeShellArgFix($file, array()))), $output);
sprintf的结果是:
"\\127.0.0.1\binary\win32\pdftk\pdftk.exe" "//127.0.0.1/uploads\1-16knje01g1drjagii61j3515a94.pdf" dump_data output
从exec运行此命令将不会产生任何结果,但如果我从Windows cmd运行它将正常工作。在我尝试了数百万个命令后,我理解问题是php正在使用sprintf输出中的反斜杠作为转义反斜杠:
**\\**127......
任何人都知道为什么会这样吗?我把所有魔法都关掉了。
修改 如果我将执行:
exec("\\127.0.0.1\binary\win32\pdftk\pdftk.exe //127.0.0.1/uploads\1-16knje01g1drjagii61j3515a94.pdf dump_data output",$outarr);
或
exec('\\127.0.0.1\binary\win32\pdftk\pdftk.exe //127.0.0.1/uploads\1-16knje01g1drjagii61j3515a94.pdf dump_data output',$outarr);
它不起作用
EDIT2: 我调试,这不是一个逃避问题,命令实际上是好的,IT似乎是一个exec问题,而不是返回输出。它适用于iis Web服务器,但在另一个iis网络服务器中不起作用。
答案 0 :(得分:2)
albanx,它不是sprintf
给你做的,它是添加反斜杠的escapeshellarg
。
http://php.net/manual/en/function.escapeshellarg.php