php shell_exec() 的问题

php shell_exec() 的问题

这里我根据命令的值得到一个查询字符串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),无论谁运行它。

相关内容