【问题标题】:shell script wiork on console but not from php page控制台上的 shell 脚本 wiork 但不是来自 php 页面
【发布时间】:2017-11-05 15:06:12
【问题描述】:

我有一个问题,我需要从网页启动一个 .sh 脚本,只是不去,从终端开始脚本可以工作并完成它必须做的事情,但是从网络上没有,但是在' Apache2 error.log 没有出错,我不明白它可以是什么..

HTML:

    <tr>
        <td>JTS</td>
        <td>
            <form action="JTSstart.php">
            <input type="submit" value="START">
            </form>
        </td>
                <td>
            <form action="JTSres.php">
            <input type="submit" value="RESTART">
            </form>
        </td>
                <td>
            <form action="JTSstop.php">
            <input type="submit" value="STOP">
            </form>
        </td>
    </tr>

PHP:

<?php
echo exec('bash JTSstop.sh');
sleep(5);
header("Location: 5ondimba.html");
?>

上海:

#!/bin/bash
cd  /home/otaku/JTS3ServerMod_HostingEdition
./jts3servermod_startscript.sh stop

我尝试过/测试过的内容: 1) exec 命令,例如 shell_exec,在 php 设置中没有被禁用。 2)文件是用dos2unix转换的。 3) bash -x 在脚本上并且不报告任何类型的错误(实际上,从控制台工作)。

可能是什么?我怎样才能让它工作? 非常感谢!

【问题讨论】:

  • 您的 PHP 脚本需要 executable rights!检查PHP-File的chmod并检查您的WebServer,哪个用户将用于执行。
  • echo exec('bash JTSstop.sh'); - 你只是在“回声”,而不是在执行。
  • @AdrianPreuss 我不认为这是权限问题,它会在日志中告诉我一些信息,无论如何我已经检查过,我认为一切正常
  • @Don'tPanic 有人建议我使用“echo”,但如果我把它取下来,什么都不会改变
  • 不,it's a permission problem!我在旧项目上使用了相同的东西来启动/重新启动/停止 Web 界面上的服务。检查权限并微笑。您可以检查,如果您有权限问题,是否使用其他命令,例如 lshostname - 如果您得到结果,例如,您知道,您的脚本无法通过您的实际权限设置访问.

标签: php bash shell


【解决方案1】:

我发现了一些问题:

1) 摆脱echo。充其量,它会显示命令的输出(如果有的话),但如果发生这种情况,它将导致您后续的header() 失败 - 必须在生成任何输出之前调用header()

2) PHP 中的路径与控制台上的 SHELL 中的路径不同。不要假设 bashJTSstop.sh 在 PHP 的 PATH 或 PHP 的当前工作目录中。最好始终完全指定路径。

3) 您的脚本已经包含#!/bin/bash,无需再次使用bash 调用它。

PHP:

<?php
exec('/full/path/to/JTSstop.sh');
sleep(5);
header("Location: 5ondimba.html");
?>

但是为什么不让事情变得简单并一起摆脱JTSstop.sh呢?

<?php
exec('cd /home/otaku/JTS3ServerMod_HostingEdition; ./jts3servermod_startscript.sh stop');
sleep(5);
header("Location: 5ondimba.html");
?>

如果您仍然遇到问题,您可以通过指定第二个参数as described in the docs 查看exec 的结果。

<?php
exec('cd /home/otaku/JTS3ServerMod_HostingEdition; ./jts3servermod_startscript.sh stop', $output);
print_r($output);

【讨论】:

  • 我已经取出“echo”,我已经添加了 jtsstop.sh 的完整路径,但现在仍然可以工作,最后我尝试将所有东西都保留在 exec('...');但无论如何都不起作用:c 在所有情况下,日志中都没有任何错误
  • @Flynns82 您可以随时获取输出以查找发生了什么。我已经更新了我的答案。
  • 通过 $output 我看到 jts 的 pid 被窃听了 o.o 现在我已经解决了所有问题,问题出在我需要启动的程序上.. 谢谢大家!!
  • 当然!,无论如何我需要一些类似的帮助,我需要运行另一个程序但它需要一个屏幕,我需要添加以防止在脚本执行结束时关闭?
  • @Don'tPanic :我认为您为推荐 (1) 给出的理由并不完全正确。也许您将 PHP echo 命令与 shell echo 命令混淆了? PHP 中的echo 评估参数并将其结果输出到标准输出。 使用 echo 进行诊断是有意义的,如果 OP 会将它与 shell_exec 一起使用。当然,只是exec是没有用的,但是原因和你发的不一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
相关资源
最近更新 更多