我在/ 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
即使它不起作用。
答案 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脚本无法生成正确的输出。