为什么这个 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.ext
。 ubuntu
用户被授权访问 file.ext
,因为它属于可以读取它的组。但是当我通过浏览器执行命令形式 php.php
脚本时,它以 abc
用户身份访问 file.ext
(abc
实际上是 apache2 的 www-data
用户)。 abc
用户(我的意思是 www-data 用户)不属于可以访问文件的组,文件也不允许 other users
读取它。因此 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.ext
。 ubuntu
用户被授权访问 file.ext
,因为它属于可以读取它的组。但是当我通过浏览器执行命令形式 php.php
脚本时,它以 abc
用户身份访问 file.ext
(abc
实际上是 apache2 的 www-data
用户)。 abc
用户(我的意思是 www-data 用户)不属于可以访问文件的组,文件也不允许 other users
读取它。因此 php 脚本未能产生正确的输出。