从webserver运行shell脚本

时间:2013-12-13 12:27:55

标签: php bash permissions homebrew

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

#!/bin/bash

brew doctor > test.txt

当我从命令行运行它时,它工作正常。它按预期将brew医生的输出输出到test.txt文件。但是,当我从php网页调用它时,它会创建test.txt文件,但该文件为空。

<?php

$output = shell_exec("./brew.sh");
echo $output;

?>

我怀疑这是权限/所有权问题,因此我使用chown将所有权从username:staff更改为_www:_www,然后创建test.txt文件写输出到它。我甚至尝试暂时将777的权限更改为test.txt,即使这样也无效。最后,我想在我的本地开发机器上的网页上查看brew doctor和brew更新的输出。当然不应该那么困难吗?

2 个答案:

答案 0 :(得分:3)

Elias是正确的我怀疑 - 假设webserver用户甚至被允许运行适当的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 Brew和Brew更新,我会使用cron作业将输出重定向到Web服务器上的文件,因为我不希望web服务器调用brew命令......有人可以通过请求很容易地对服务器执行操作那些页面很多。 cron解决方案虽然非常防弹 - 但无论如何使用cron我可以将其作为更合适的用户运行,其中brew的权限/环境在任何情况下都可能更正确。

此外 - 其他人指出检查错误是一个很好的。当您获得空输出时,stderr可能会在您的Web日志中结束。 2&gt;&amp; 1可以使它进入该文件,可能是。

[注意它必须是2&gt;&amp; 1 !!我认为克里斯在撰写&gt; 2&amp; 1时会有一个拼写错误。 2是我们想要重定向到1的stderr文件句柄。> 2将1(stdout)重定向到名为2的文件。

答案 1 :(得分:0)

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

<?php

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

?>