Raspberry Pi lighttpd环境下网页按钮无法执行关机脚本问题求助
问题根因
lighttpd默认将.sh后缀文件作为静态文本资源返回,没有配置对应规则将其识别为可执行CGI脚本,因此点击按钮后不会执行脚本只会返回源码内容。推荐用更简单的PHP调用逻辑实现需求,无需额外配置CGI规则:
具体操作步骤
- 修改
index.php代码,将表单提交逻辑放到当前PHP文件中处理,不需要单独跳转执行shell脚本:
<?php // 处理POST提交请求 if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['Submit'])) { // 调用关机命令,注意要加sudo且www-data有权限执行 exec('sudo /sbin/shutdown now'); echo "正在执行关机操作,请稍候断电"; exit; } ?> <!DOCTYPE html> <html lang="en"> <body> <form method="post" action=""> <input type="submit" value="点击关机" name="Submit"> </form> </body> </html>
- 修正sudo权限配置,避免给www-data全root权限带来安全风险,执行
visudo命令,删除之前加的全权限配置,替换为以下规则:
www-data ALL=NOPASSWD: /sbin/shutdown
- 确认
shutdown命令的实际路径是否为/sbin/shutdown,可以在树莓派终端执行which shutdown查看,如果路径不同就把上面代码和sudo规则里的路径替换成实际查询到的路径。 - 重启lighttpd服务生效:
sudo systemctl restart lighttpd
额外验证项
- 确认lighttpd的PHP解析功能正常,随便写一个包含
<?php phpinfo();?>的PHP文件放到站点目录访问,能正常输出PHP信息就说明解析正常。 - 可以先把exec里的命令换成
echo 'test' > /tmp/test.txt,测试点击按钮后是否生成了对应的文件,确认PHP执行外部命令的功能正常,再换成关机命令。
内容的提问来源于stack exchange,提问作者Pseudomax
相关产品推荐
相关产品推荐

