我想使用PHP来运行以目录作为参数的shell命令。问题是,此目录名称包含单引号和空格。在shell中,如果目录被称为“我是一个目录”,这将是这样的:
ls I\'m\ a \ directory
但是,在通过PHP调用时,我无法正常工作。我试过了exec('ls I\'m\ a\ directory')
和许多其他变种,但它们似乎都没有用。有什么建议?提前谢谢!
答案 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