我有一个名为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更新的输出。当然不应该那么困难吗?
答案 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;
?>