21

我正在使用 shell_exec 方法从 PHP 调用 test.sh。

$my_url="http://www.somesite.com/";
$my_refer="http://www.somesite.com/";
$page = shell_exec('/tmp/my_script.php $my_url $my_refer');

但是,命令行脚本说它只收到 1 个参数:/tmp/my_script.php

当我将呼叫更改为:

代码:

$page = shell_exec('/tmp/my_script.php {$my_url} {$my_refer}');

它说它收到了 3 个参数,但 argv[1] 和 argv[2] 是空的。

当我将呼叫更改为:

代码:

$page = shell_exec('/tmp/my_script.php "http://www.somesite.com/" "http://www.somesite.com/"');

脚本最终按预期接收所有 3 个参数。

您是否总是必须在脚本中发送仅引用的文本,并且不允许发送像 $var 这样的变量?或者有什么特殊的方式你必须发送一个 $var ?

4

6 回答 6

25

改变

$page = shell_exec('/tmp/my_script.php $my_url $my_refer');

$page = shell_exec("/tmp/my_script.php $my_url $my_refer");

或者

$page = shell_exec('/tmp/my_script.php "'.$my_url.'" "'.$my_refer.'"');

还要确保同时使用escapeshellarg您的两个值。

例子:

$my_url=escapeshellarg($my_url);
$my_refer=escapeshellarg($my_refer);
于 2013-06-05T05:28:23.020 回答
17

需要发送带有配额的参数,因此您应该像这样使用它:

$page = shell_exec("/tmp/my_script.php '".$my_url."' '".$my_refer."'");
于 2013-06-05T05:30:04.717 回答
10

变量不会插入到单引号字符串中。此外,您应该确保您的论点已正确转义。

 $page = shell_exec('/tmp/myscript.php '.escapeshellarg($my_url).' '.escapeshellarg($my_refer));
于 2013-06-05T05:35:29.177 回答
2

改变

$page = shell_exec('/tmp/my_script.php $my_url $my_refer');

$page = shell_exec('/tmp/my_script.php "'.$my_url.'" "'.$my_refer.'"');

然后你的代码将容忍文件名中的空格。

于 2013-06-05T05:31:36.767 回答
2

您可能会sprintf在这里找到帮助:

$my_url="http://www.somesite.com/";
$my_refer="http://www.somesite.com/";
$page = shell_exec(sprintf('/tmp/my_script.php "%s" "%s"', $my_url, $my_refer));

escapeshellarg如果您不是提供输入的人,则绝对应该按照其他答案中的建议使用。

于 2013-06-05T05:49:11.810 回答
2

我对此有困难,所以想分享我的代码片段。

$output = shell_exec("/var/www/sites/blah/html/blahscript.sh 2>&1 $host $command");

$output = shell_exec("/var/www/sites/blah/html/blahscript.sh 2>&1 $host {$command}");

添加{}括号对我来说是固定的。

此外,escapeshellarg还需要确认。

$host=escapeshellarg($host);
$command=escapeshellarg($command);

除了脚本还需要:

set host [lindex $argv 0]
set command [lindex $argv 1]
于 2015-07-30T11:34:05.757 回答