从Web服务器运行shell脚本


Running shell script from webserver

我有一个名为brew.sh的shell脚本,如下所示:

#!/bin/bash
brew doctor > test.txt

当我从命令行运行它时,它工作得很好。它按预期将brew doctor的输出输出到test.txt文件中。但是,当我从php网页调用它时,它会创建test.txt文件,但该文件是空的。

<?php
$output = shell_exec("./brew.sh");
echo $output;
?>

我怀疑这是权限/所有权问题,所以我使用chown将父目录上的所有权从username:staff更改为_www:_www,然后它会在父目录中创建test.txt文件,但不会向其写入输出。我甚至尝试在test.txt上临时将权限更改为777,但这都不起作用。最终,我想在本地开发机器的网页上查看brew doctor和brew更新的输出。肯定不会那么难吧?

Elias是对的,我怀疑-假设Web服务器用户甚至被允许运行正确的shell,cmd行上的环境不会像脚本在Web服务器中所处的环境那样。。。

你需要一条路。检查您的路径值,并将其放入

总是包含二进制文件(即brew)的完整路径也没有坏处。

#!/bin/bash
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"
/usr/local/bin/brew doctor > /var/www/whatever/test.txt

个人这不是我会使用的方法。如果这是针对brew-doctor和brew-update的,我只会使用cron作业将输出重定向到Web服务器上的文件,因为我不希望Web服务器调用brew命令。。。有人只需要大量请求这些页面就可以很容易地拒绝服务器。不过,cron解决方案是非常防弹的——在任何情况下,使用cron,我都可以作为更合适的用户运行它,在这种情况下,brew的权限/环境都可能更正确地工作。

另外,其他人关于检查错误的观点也很好。当您得到空输出时,stderr可能会出现在您的web日志中。2> &我可能会把它放进那个文件里。

[注意,它必须是2>&1!!我认为chris在写>2&时有一个拼写错误,这做了一些非常不同的事情。2是我们想要重定向到1的stderr文件句柄。>2将把1(stdout)重定向到一个名为2的文件。

如果将2>&1添加到shell命令中,则应该返回STDERR和STDOUT,这至少可以帮助您确定发生了什么:

<?php
$output = shell_exec("./brew.sh >2&1");
echo $output;
?>