【问题标题】:Starting shell process under www-data (apache2, php)在 www-data (apache2, php) 下启动 shell 进程
【发布时间】:2013-02-09 12:10:46
【问题描述】:

我需要使用一些参数从删除服务器上的 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 用户执行此 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 下运行进程?

【问题讨论】:

  • 如果您在 bash 脚本中 echo something $1 会发生什么。你在任何地方都能得到“某物”的输出?
  • 我想启动的守护进程似乎有问题,至于 bash 脚本。我可能在调用时出错,我忘记了一个引号 :((
  • 所以,bash 脚本正确返回结果,我是白痴:(
  • 我们所有人都遇到了一个错字。无需费心;)

标签: php linux shell apache2


【解决方案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>";

确保(shell_)exec 未在您的 php.ini 中的 disable_functions 下列出

【讨论】:

  • 如何授予 www-data 用户权限以执行 shell 命令? (我想问题应该在这里,我不记得 php.ini 中禁用 shell 脚本执行的任何特殊设置)
  • 也许问题不在 php 中,如果 root 下的 'su -c ... www-data' 没有给出任何结果
  • 您可以禁用 php.ini 中的几乎所有 php 函数,包括 exec、shell_exec、passthru 等...我想您遇到的问题是您没有获取和回显 shell 执行的结果。
  • 你不能在 php 中使用 su ...首先没有大量的努力和特殊设置(至少将特权添加到 www-data 到 su),据我所知 www-data 无法运行这种方式的shell脚本(我不记得信息的来源,所以我不确定那个atm)
  • 也许使用php5-ssh2包远程运行shell命令更容易?这样 php 将以普通用户身份登录并执行他需要的一切.. 我只是害怕负载(可能同时执行 ~50 个命令,所以它将是 ~50 个 ssh 连接)。没事吧?
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多