包含空格的参数的php exec()

时间:2013-07-02 23:58:30

标签: php shell

我想使用PHP来运行以目录作为参数的shell命令。问题是,此目录名称包含单引号和空格。在shell中,如果目录被称为“我是一个目录”,这将是这样的:
ls I\'m\ a \ directory

但是,在通过PHP调用时,我无法正常工作。我试过了exec('ls I\'m\ a\ directory')
和许多其他变种,但它们似乎都没有用。有什么建议?提前谢谢!

3 个答案:

答案 0 :(得分:2)

为此具有php函数escapeshellarg。输入所需的任何字符串,结果将采用字符串格式,因此可以将其用作shell中的一个参数:

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

答案 1 :(得分:1)

你需要正确地双击你的斜线,以确保它们不被字符串吃掉。

您的部分问题是\'正在被吃掉并以'传递给命令行。

比较这些:

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")

答案 2 :(得分:1)

试试这个:

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