使用PHP执行Shell命令

3

我正在尝试通过一个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 拥有所有权限。

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

提前感谢您的帮助。


使用 sh /path/to/wakenas.sh 命令ls -l wakenas.sh: -rwxrwxrwx 1 www-data www-data 126 Jun 4 12:47 wakenas.sh - Gutz-Pilz
你的脚本看起来没问题,尝试使用 var_dump(shell_exec("/var/www/html/wakenas.sh &")); 查看它是否返回 NULL (http://php.net/manual/en/function.shell-exec.php#refsect1-function.shell-exec-returnvalues),并检查 /var/www/html/works.txt 文件的内容。 - smarber
你应该更新你的帖子并附上输出结果,这样能够帮助你的人就可以看到它了。 - smarber
1
最后一件事,ls -l /var/www/html/works.txt - smarber
1
根据您的使用情况,我猜测您可能通过像apache这样的web服务器访问php? apache用户(通常为nobodywww-dataapache2)是否有权执行wakenas.sh? 请注意,如果该页面存在_任何_公共访问权限,则不应将shell访问/执行权限授予您的Web服务器。 - vastlysuperiorman
显示剩余2条评论
3个回答

1

执行脚本的简单和安全方法是将其放在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


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;

0

从您的转储中:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接