【问题标题】:Running shell script from webserver从网络服务器运行 shell 脚本
【发布时间】:2014-01-01 05:23:07
【问题描述】:

我有一个名为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 update 的输出。应该没那么难吧?

【问题讨论】:

  • 用户_www$PATH 是否包含brew 的路径,用户是否获得了运行bin 所需的权限?
  • 我已经通过以下信息将 brew 添加到 apache 路径 environment variable for apache 仍然没有乐趣。

标签: php bash permissions homebrew


【解决方案1】:

我怀疑 Elias 是对的 - 你在 cmd 行上的环境不会像脚本在网络服务器中所处的环境那样,假设网络服务器用户甚至被允许运行适当的 shell...

你需要一个路径。检查你的路径值是什么,然后把它放进去。

始终包含二进制文件的完整路径也没有什么坏处,即 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 作业,因为我不希望网络服务器调用 brew 命令......有人可以通过请求这些页面轻松地对服务器进行 DoS很多。 cron 解决方案是非常安全的 - 无论如何使用 cron,我都可以作为更合适的用户运行它,其中 brew 的权限/环境在任何情况下都可能更正确地工作。

另外 - 其他人指出检查错误是一个很好的。当您获得空输出时,stderr 可能最终会出现在您的网络日志中。 2>&1 可能会使其进入该文件。

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

【讨论】:

  • 关于不允许网络服务器运行适当的 shell 的好点:它不能,例如,.profile 没有加载。 OP 将不得不使用管道,我认为as I did, after posting my first question on SO
  • 感谢和平主义者,这解释了为什么它如此困难!看来我还有很多东西要学。我现在设置了一个 cron 作业,它输出到一个 basic.html 页面,该页面或多或少地完成了我正在尝试做的事情。
【解决方案2】:

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

<?php

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

?>

【讨论】:

  • 我现在得到 2 个文件,一个叫 test.txt 是空白的,另一个叫 2 也是空白的!
  • @DigitalChris:该脚本没有具有输出,它由一个命令组成,该命令将其标准输出重定向到一个文件。这是 OP 希望看到的文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多