我在/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.ext
。ubuntu
用户被授权访问file.ext
,因为它属于可以读取它的组。但当我通过浏览器执行命令表单php.php
脚本时,它以abc
用户的身份访问了file.ext
(abc
实际上是apache2的www-data
用户)。abc
用户(我指的是www数据用户)既不属于可以访问该文件的组,也不允许other users
读取该文件。因此php脚本无法产生正确的输出。