我想使用 PHP 运行一个以目录为参数的 shell 命令。问题是,这个目录名包含单引号和空格。在 shell 中,如果目录被称为“我是一个目录”,这将是这样的:
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");
您需要正确地对斜线进行双重转义,以确保它们不会被字符串吃掉。
您的部分问题是\'
被吃掉并传递给命令行'
。
比较这些:
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")
尝试这个:
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