【发布时间】:2011-07-26 06:23:54
【问题描述】:
我正在 PHP 应用程序中执行以下操作:
$source = '/home/user/file.ext';
$output_dir = $this->setOutputString();
chdir('/home/ben/xc/phplib/bgwatcher-2011a/a01/');
exec('php bin/createjob.php $source $output_dir', $output);
return $output[0];
问题是这样的:我可以控制$source,但不能控制$output_dir,这是一个旧的Windows 文件系统,并且路径中有空格。一个例子$output_dir 是:
/home/vol1/district id/store id/this_is_the_file.html
将输出字符串插入exec()函数时,我都尝试了:
addslashes($output_dir) 和 '"' . $output_dir . '"' 转义整个输出字符串。在第一种情况下,路径被连接到:
/home/vol1/districtthis_is_the_file.html
... 第一个空格和文件名之间的所有内容都被删除。在第二种情况下,exec() 似乎扔了一只鞋并且无法正常执行 - 不幸的是,错误消息在机器中丢失了 - 如果绝对必要,我可以提供它,但我也有时间限制找到解决办法。
这里有什么解决方案?我是sprintf() exec() 的整个字符串吗?我很困惑为什么addslashes 不能正常工作以逃避空格,我认为它与 exec() 的清理有关,但我找不到任何文档来支持它。
更新:我尝试了 escapeshellarg() 和 preg_replace() 都没有成功。进一步考虑这一点,我是否需要双重逃避路径?还是逃避路径和命令?如果路径被 exec() 转义一次,并且在 PHP 执行命令之前被 PHP 转义一次,我是否需要考虑这两种转义?或者这不是它的工作原理?
【问题讨论】: