用php执行shell命令

用php执行shell命令,php,bash,shell,Php,Bash,Shell,我试图用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

我试图用
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 &");
  }?>
wakenas.sh
拥有所有权利

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

提前感谢您的倾诉:

etherwake: This program must be run as root.
当您执行wakenas.sh时,您可能正在以root用户身份执行它。这就是它起作用的原因

向运行php服务器的用户授予sudo权限(无密码)

并将wakenas.sh更改为:

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

我最近发布了一个项目,该项目允许PHP获取一个真正的Bash shell并与之交互(如果请求,则作为root),它解决了exec()和shell_exec()的限制。在这里获取:

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

$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;

执行脚本的简单而安全的方法是放入sudoers。假设您的Linux发行版是Debian base,运行web服务器的用户是
www data
,那么您可以创建一个文件,例如
/etc/sudoers.d/wakeup\u 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 &");

参考资料:

如何在shell上执行它<代码>shell wakenas.sh?你能把
ls-l/path/to/wakenas.sh
的输出与
sh/path/to/wakenas.sh
ls-l wakenas.sh:
-rwxrwx 1 www-data www-data 126 Jun 4 12:47 wakenas.sh
你的脚本在我看来是正确的,试着
var\u转储(shell\u exec(“/var/www/html/wakenas.sh&”)
要查看它是否返回
NULL
(),并检查您的
/var/www/html/works.txt
文件内容最后一件事,
ls-l/var/www/html/works.txt
根据您的用例,我猜您可能是通过apache这样的web服务器访问php?apache用户(通常是
nobody
www-data
apache2
)是否有权执行
wakenas.sh
?请注意,如果有任何对该页面的公共访问,则不应授予您的web服务器的shell访问/执行权限。
shell_exec("sudo /var/www/html/wakenas.sh &");