为什么这个shell脚本没有像PHP预期的那样运行


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

我在/var/www文件夹中有一个PHP程序,用于运行shell脚本并加载该shell脚本创建的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*

在执行PHP之前,/var/tmp/reports/r.html并不存在。通过命令行直接执行脚本后,它会创建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

第1版:在@laterer的建议下,我试着把script.sh改成

#!/bin/sh
cat file.log | awk '{if(substr($5,2)>="'$1'" && substr($5,2)<="'$2'")print $0}' | awk 'gsub(",", "", $1);' | /usr/bin/command > /var/tmp/reports/r.html

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

第2版:我将脚本更改为->

#!/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数据用户)既不属于可以访问该文件的组,也不允许other users读取该文件。因此php脚本无法产生正确的输出。