用php执行shell命令

时间:2015-06-04 10:55:36

标签: php bash shell

我尝试使用php/html按钮执行bash脚本以唤醒我的鼻子。

<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拥有所有权利

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

提前致谢

3 个答案:

答案 0 :(得分:0)

来自您的转储:

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

答案 1 :(得分:0)

我最近发布了一个项目,允许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;

答案 2 :(得分:0)

执行脚本的简单而安全的方法是放入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