shell脚本wiork在控制台上但不是来自php页面

时间:2017-11-05 15:06:13

标签: php bash shell

我有一个问题,我需要从网页启动一个.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>
&#13;
&#13;
&#13;

PHP:

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

SH:

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

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

它会是什么?我怎么能让它发挥作用? 非常感谢!

1 个答案:

答案 0 :(得分: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);