在www-data(apache2,php)下启动shell进程

时间:2013-02-09 12:10:46

标签: php linux shell apache2

我需要从删除服务器上的shell启动php进程并带有一些参数,所以我认为创建REST API应该是个好主意,当用户执行GET请求时会执行某些功能。

我编写了一个简单的bash脚本进行测试,并在从网站调用此脚本时发现没有指定命令行参数:

shell_exec('/var/www/test.sh 123')

Bash脚本源:

#!/bin/sh
echo $1;

从root(或其他现有用户)调用此bash脚本时,它会正确显示已收到的参数。当我从网站调用此脚本时(在apache2下的用户www-data下运行),它什么都不返回:

另外,如果我在我的控制台中使用www-data user执行此bash脚本,它也不会返回任何内容:

su -c '/var/www/test.sh 123' www-data

此外,我也尝试从不同的用户启动php的过程(假设出于安全原因这不起作用,但以防万一):

$result = system("su -c '/var/www/test.sh 123' sexyuser", $data);
// var_dump($result): string(0) ""
// var_dump($data): int(1)

那么,我应该赋予www-data用户在php下运行进程的权限?

1 个答案:

答案 0 :(得分:1)

你应该让php运行脚本并处理结果

在exec上检查php.net,例如http://www.php.net/manual/en/function.exec.php

//called by example.com/myshell.php?day=today&k=y&whatever=youwant
$arguments = implode(" ", $_GET);
$lastline_of_exec_result = exec ( "/your/command.sh ".$arguments); //sh called with today y youwant
echo $lastline_of_exec;

其中$ arguments是脚本从GET参数获取的所有信息的字符串列表

如果你想要一个精确的输出和输出,试试这个:

//called by example.com/myshell.php?day=today&k=y&whatever=youwant
$argument = $_GET['whatever'];
$output = array();
$last_line = exec("your/command.sh ".$argument, &$output); //sh called with youwant
foreach($output as $line)
    echo $line."<br/>".PHP_EOL;

或当然(使用shell_exec)

$argument = $_GET['whatever'];
$output = shell_exec("your/command.sh ".$argument);
echo "<pre>".$output."</pre>";

确保您的php.ini

中的(shell_)exec下未列出disable_functions