为什么这个shell脚本没有按预期从PHP运行?

时间:2015-02-13 11:48:02

标签: php linux bash shell shell-exec

我在/ 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 SCRIPT

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 / report / 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

Edit1:在@ lurker的建议中,我尝试将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

它也只生成一个空文件。

Edit2:我将脚本更改为 - &gt;

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

即使它不起作用。

1 个答案:

答案 0 :(得分:1)

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