我想使用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")