PHP 的 Escapeshellarg 不能与 exec 一起使用(字符串未封装在引号中)


php's escapeshellarg not working with exec (string not encapsulated in quotes)

我有一个简单的两行脚本:

<?
        $str = '"<!DOCTYPE><html><head></head><body><h1>FOOO</h1></body></html>"';
        exec('phantomjs '.escapeshellarg(dirname(__FILE__).'/render.js ').''.escapeshellarg($str));
?>

从控制台运行它时,我得到:

Can't open '/Users/me/render.js <!DOCTYPE><html><head></head><body><h1>FOOO</h1></body></html>'

因此,字符串没有按应有的方式封装在引号中。我在这里做错了什么?系统是OSX 10.7,php 5.3.6。

当我在相同的 php 版本的 OS X 10.7 上尝试此操作时,我按预期将字符串括在单引号中。但是,输出可能不是您所期望的。我会首先回显您传递给 exec 的命令,并尝试将该命令复制粘贴到终端中以查看它是否有效。这样你会更好地看到问题。这是我根据你的代码所做的:

$str = '"<!DOCTYPE><html><head></head><body><h1>FOOO</h1></body></html>"';
$command = 'phantomjs '.escapeshellarg(dirname(__FILE__).'/render.js ').
           ''.escapeshellarg($str);
echo "$command'n";

我得到了这个:

phantomjs '/Users/me/render.js ''"<!DOCTYPE><html><head></head><body><h1>FOOO</h1></body></html>"'

如果它是正确的但仍然不起作用,您应该检查您的路径并确保文件位于脚本认为它们所在的位置。

最终工作命令:

$str = '"<!DOCTYPE><html><head></head><body><h1>FOOO</h1></body></html>"';
$command = 'phantomjs '.dirname(__FILE__).'/render.js '.$str;
exec($command);