这里我根据命令的值得到一个查询字符串shell_exec()
。
我收到查询字符串的值,但shell_exec()
不起作用。
我正在使用连接到 Raspberry pi 3 的网络摄像头,因此命令shell_exec()
是打开和关闭网络摄像头。
$output=shell_exec('sudo /etc/init.d/motion start')
代码:
<?php
$status=$_GET['status'];
if($status == 'on')
{
$output=shell_exec('sudo /etc/init.d/motion start');
}
if($status == 'off')
{
$output=shell_exec('sudo /etc/init.d/motion start');
}
如何解决执行问题?
答案1
通常的方法是创建 suid 包装二进制文件,而不是尝试授予 apache/http 用户 sudo 权限,如下所示:
$ sudo gcc -o suidmotion -xc - <<cEnd
#include "stdlib.h"
#include "string.h"
int main(int argc, char *argv[])
{ if (argc ==2)
{ if (!strcmp(argv[1], "start")) system("/etc/init.d/motion start");
if (!strcmp(argv[1], "stop" )) system("/etc/init.d/motion stop");
}
}
cEnd
$ sudo chmod +s suidmotion
...而不是在 php 中调用shell_exec("/path/to/suidmotion start/stop");
sudo gcc
将生成suidmotion
由 拥有的输出二进制文件root:root
,并chmod +s
确保执行时的二进制文件权限将升级到二进制文件所有者(root),无论谁运行它。