【问题标题】:execute shell command with php用php执行shell命令
【发布时间】:2015-08-18 22:56:02
【问题描述】:

我正在尝试使用 php/html 按钮执行 bash 脚本来唤醒我的 nas。

<form action="" method="POST">
    <input type="submit" value="Wake NAS" name="zero" />
</form>
<?php
  if (isset($_POST["zero"])){
    #echo "Hello World!";
    shell_exec("/var/www/html/wakenas.sh &");
  }?>

按下按钮时会打印“Hello World”。 但代码不会被执行。 wakenas.sh 看起来像这样,如果我在 shell 上执行它就可以工作

#!/bin/bash
etherwake -D "BC:5F:F4:09:E1:07"
echo "why!?!?!" > "/var/www/html/works.txt"
exit 1

wakenas.sh拥有所有权利

也许你们知道为什么它不会被执行。

提前致谢

【问题讨论】:

  • 你如何通过 shell 执行它? shell wakenas.sh?你能把ls -l /path/to/wakenas.sh的输出放上去吗
  • with sh /path/to/wakenas.sh ls -l wakenas.sh: -rwxrwxrwx 1 www-data www-data 126 Jun 4 12:47 wakenas.sh
  • 你的脚本对我来说似乎是正确的,尝试var_dump(shell_exec("/var/www/html/wakenas.sh &amp;")); 看看它是否返回NULL (php.net/manual/en/…) 并检查你/var/www/html/works.txt 文件内容
  • 最后一件事,ls -l /var/www/html/works.txt
  • 我根据您的用例猜测,您可能是通过 apache 之类的 Web 服务器访问 php? apache 用户(通常是nobodywww-dataapache2)是否有权执行wakenas.sh?请注意,如果对页面有任何公共访问权限,则不应授予对 Web 服务器的 shell 访问/执行权限。

标签: php bash shell


【解决方案1】:

来自您的转储:

etherwake: This program must be run as root.

当您执行 wakenas.sh 时,您可能是以 root 身份执行它。这就是它起作用的原因。

将 sudo 权限(无密码)授予您的 php 服务器正在运行的用户。

并将 wakenas.sh 更改为:

#!/bin/bash
sudo etherwake -D "BC:5F:F4:09:E1:07"
echo "why!?!?!" > "/var/www/html/works.txt"
exit 1

【讨论】:

    【解决方案2】:

    我最近发布了一个项目,它允许 PHP 获取并与真正的 Bash shell 交互(如果需要,作为 root 用户),它解决了 exec() 和 shell_exec() 的限制。在这里获取:https://github.com/merlinthemagic/MTS

    下载后您只需使用以下代码:

    $shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
    $return1  = $shell->exeCmd("etherwake -D \"BC:5F:F4:09:E1:07\"");
    //the return will be a string containing the return of the command
    echo $return1;
    

    【讨论】:

      【解决方案3】:

      执行脚本的简单且安全的方法是放入 sudoers。假设您的 Linux 发行版是 Debian 基础并且运行 Web 服务器的用户是 www-data,那么您可以创建一个文件,例如 /etc/sudoers.d/wakeup_ether

      Cmnd_Alias WAKE_UP_CMD = /var/www/html/wakenas.sh
      www-data ALL=NOPASSWD: WAKE_UP_CMD
      

      修改您的脚本,为命令添加前缀sudo

      shell_exec("sudo /var/www/html/wakenas.sh &");
      

      参考:https://help.ubuntu.com/community/RootSudo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-06
        • 2014-04-21
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多