PHP exec()和路径中的空格

b. *_*eck 14 php path exec

我正在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];
Run Code Online (Sandbox Code Playgroud)

问题是:我可以控制$source,但不是$output_dir,这是一个传统的Windows文件系统,并且路径中有空格.一个例子$output_dir是:

/home/vol1/district id/store id/this_is_the_file.html
Run Code Online (Sandbox Code Playgroud)

将输出字符串插入exec()函数时,我尝试了两种方法:

addslashes($output_dir)'"' . $output_dir . '"'转义整个输出字符串.在第一种情况下,路径连接到:

/home/vol1/districtthis_is_the_file.html

...第一个空格和文件名之间的所有内容都被删除了.在第二种情况下,exec()似乎扔鞋并且没有正确执行 - 不幸的是,错误信息在机器中丢失 - 我可以提供它,如果它是绝对必要的,但我也在时间限制下找到解决方案.

这是什么解决方案?我sprintf()是整个字符串exec()吗?我很困惑为什么addslashes不能正常工作以逃避空间,我认为它与exec()的清理有关,但我找不到任何备份它的文档.

更新:我已经尝试了escapeshellarg()和preg_replace()但没有成功.进一步思考这个问题,我是否需要双重逃避这条道路?还是逃避路径和命令?如果路径被exec()取消一次,并且在执行命令之前由PHP取消一次,那么我是否需要考虑这两个转义?或者这不是它的工作原理吗?

Mic*_*ski 9

我不相信addslashes()有任何空间. escapeshellarg()可能是你想要的.关于escapeshellarg的文档


Boj*_*les 8

从PHP doc(这里),

在需要在数据库查询等中引用的字符之前返回带有反斜杠的字符串.这些字符是单引号('),双引号("),反斜杠()和NUL(NULL字节).

这对空间没有任何作用.您需要做的是使用str_replace()添加斜杠,如下所示:

$new_string = str_replace(" ", "\\ ", $old_string);


Dem*_*cht 7

根据PHP文档,

在需要在数据库查询等中引用的字符之前返回带有反斜杠的字符串.这些字符是单引号('),双引号("),反斜杠()和NUL(NULL字节).

看起来你必须自己preg_replace空间.

编辑:

虽然这是另外一个讨论的话题,如果性能是一个问题,然后寻找到它多一点之后,似乎str_replace 比实际上相当快一点preg_replace:

标记为"str_replace()"的测试速度提高了0.9053秒(时间为10.3%).

第一次测试耗时1.0093秒.(preg_replace)

第二次测试耗时0.104秒.(str_replace)

基准测试在这里找到.


Kro*_*mey 5

exec()之前在 Windows 和 Linux 主机上都使用过带空格的路径,在这两种情况下,引用路径对我来说都非常有效。

也就是说,如果您无法控制 shell 参数的安全性,请始终先运行它escapeshellarg()