PHP exec() 和路径中的空格

2022-08-31 00:28:44

我正在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];

问题是这样的:我可以控制 ,但不能控制 ,这是一个遗留的Windows文件系统,并且路径中有空格。例如:$source$output_dir$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()

解决方案是什么,在这里?我是整个字符串吗?我非常困惑为什么不能正常工作以逃避空格,并且我认为它与exec()的清理有关,但我找不到任何文档来支持它。sprintf()exec()addslashes

更新:我尝试过escapeshellarg()和preg_replace()但没有成功。进一步思考这个问题,我需要双重逃生路径吗?还是逃避路径和命令?如果 exec() 取消了一次路径转义,PHP 在执行命令之前取消了一次转义,那么我需要同时考虑这两个转义吗?或者这不是它的工作方式吗?


答案 1

我不相信对空间做任何事情。 可能是你想要的。关于 escapeshellarg 的文档addslashes()escapeshellarg()


答案 2

从 PHP 文档(此处),

返回一个字符串,在数据库查询等中需要加引号的字符之前带有反斜杠。这些字符是单引号 (')、双引号 ()、反斜杠 () 和 NUL(空字节)。

这不会对空间做任何事情。您需要做的是使用添加斜杠,如下所示:str_replace()

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


推荐