为什么这个 shell 脚本不是 PHP 预期的 运行?

Why is this shell script not running as expected from PHP?

我在 /var/www 文件夹中有这个 PHP 程序到 运行 一个 shell 脚本并加载由 [=59= 创建的 HTML 文件] 脚本。如果我从命令行手动 运行 shell 脚本,那么它就像魅力一样工作,但是当 运行 通过浏览器的 PHP 程序时,它只会创建一个空文件。

PHP代码

$a = './script.sh '.$foo.' '.$bar;
$b = shell_exec($a);
include '/var/tmp/reports/r.html';

SHELL脚本

cat file.ext | awk <something with $foo and $bar> | command > /var/tmp/reports/r.html

(编辑^ "file.ext"实际上是一个.log文件。它位于/var/log/..而"command"是另一个程序,它创建一个.html 来自该日志文件的文件)

我的文件的权限是:

-rw-r--r-- 1 abc    www-data   848 Feb 13 10:43 php.php
-rwxr-xr-x 1 ubuntu www-data   230 Feb 13 10:51 script.sh*

并且 /var/tmp/reports/r.html 在执行 PHP 之前不存在。 直接通过命令行执行脚本后,它会创建 r.html 文件,如:

-rw-rw-r-- 1 ubuntu ubuntu 121884 Feb 13 11:42 r.html

但是当通过 PHP 从浏览器执行脚本时,它会创建一个像这样的空文件

-rw-r--r-- 1 www-data www-data      0 Feb 13 11:43 r.html

Edit1 :在@lurker 的建议下,我尝试将 script.sh 更改为

#!/bin/sh

cat file.log | awk '{if(substr(,2)>="''" && substr(,2)<="''")print [=18=]}' | awk 'gsub(",", "", );' | /usr/bin/command > /var/tmp/reports/r.html

它也只生成了一个空文件。

Edit2:我将脚本更改为 ->

#!/bin/bash
sudo echo "sdfsf" > /var/tmp/reports/r.html

连它都不行。

对于命令 cat file.ext | awk <something with $foo and $bar> | command > /var/tmp/reports/r.html,当我直接从 script.sh 执行它时,它以 ubuntu 用户的身份接近 file.extubuntu 用户被授权访问 file.ext,因为它属于可以读取它的组。但是当我通过浏览器执行命令形式 php.php 脚本时,它以 abc 用户身份访问 file.extabc 实际上是 apache2 的 www-data 用户)。 abc 用户(我的意思是 www-data 用户)不属于可以访问文件的组,文件也不允许 other users 读取它。因此 php 脚本未能产生正确的输出。