1

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

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

4

3 回答 3

2

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

$rawArgument = "I'm a directory";
$escapedArgumment = escapeshellarg($rawArgument);
exec("ls $escapedArgumment");
于 2018-11-10T13:25:31.893 回答
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")
于 2013-07-03T00:02:30.547 回答
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
于 2013-07-03T00:16:50.710 回答