php exec(),参数包含空格


php exec() with arguments containing spaces

我想使用PHP运行一个以目录为参数的shell命令。问题是,这个目录名同时包含单引号和空格。在shell中,如果目录被称为"I’m a directory",这将类似于:
ls I''m' a ' directory

然而,当通过PHP调用时,我无法实现这一点。我尝试了
exec('ls I''m' a' directory')
和许多其他变体,但似乎都不起作用。有什么建议吗?提前感谢!

有php函数escapeshellarg用于此。您可以输入所需的任何字符串,结果是字符串格式的,这样您就可以将其用作shell中的一个参数:

$rawArgument = "I'm a directory";
$escapedArgumment = escapeshellarg($rawArgument);
exec("ls $escapedArgumment");

试试这个:

passthru('ls "I''m a directory"');

exec()返回输出的最后一行,这可能不是您所期望的。将其与此进行比较:

exec('ls "I''m a directory"', $outvar);
print_r($outvar);

我想所有人都读过这本精美的手册,但它就在这里,以防万一:http://us1.php.net/manual/en/function.exec.php

FreeBSD:上的概念验证会话示例

501:~$ mkdir "I'm a directory"
502:~$ ls -lrt
drwxr-xr-x   2 cxj  cxj       512 Jul  2 19:32 I'm a directory
drwxr-xr-x  33 cxj  cxj      2048 Jul  2 19:32 .
503:~$ cd I''m' a' directory/
504:~/I'm a directory$ touch foo bar baz
505:~/I'm a directory$ cd ..
506:~$ cat - > test.php
<?php passthru('ls "I''m a directory"'); ?>
507:~$ cat test.php
<?php passthru('ls "I''m a directory"'); ?>
508:~$ php test.php
bar
baz
foo

您需要正确地对斜杠进行双转义,以确保它们不会被字符串吃掉。

部分问题是''被吃掉并作为'传递到命令行。

比较这些:

echo 'ls I''m' a' directory';
echo "'n";
echo "ls I''m' a' directory"; //Note double quotes
echo "'n";
echo 'ls I''''m'' a'' directory';
echo "'n";
echo "ls I''''m'' a'' directory";  //Note double quotes

结果:

ls I'm' a' directory
ls I''m' a' directory
ls I''m' a' directory
ls I'''m' a' directory

所以你真正想要的是这两种:

exec('ls I''''m' a' directory')
exec("ls I''m' a' directory")