使用php shell_exec()执行命令行以启动服务器上的摄像头

时间:2012-03-13 16:18:40

标签: php shell opencv archlinux

我正在使用opencv在我的arch linux上启动摄像头。当我从服务器本身的命令行实际执行它时,它会启动并运行良好。 我想用php初始化它。我尝试使用PHP中的shell_exec来完成它。

我的PHP文件如下:

<?php
$output=shell_exec('LD_LIBRARY_PATH=usr/local/lib ./a.out 0 2>&1 1>/dev/null');
echo $output;
?>

它给出了这个输出: ERROR: capture is NULL

我通过我的Windows Web浏览器作为客户端运行它,opencv和相关文件位于我的arch linux服务器上。

当我从windows web浏览器运行这个php文件时,我想启动相机并捕获图像,但是当执行它时会抛出错误,如上所述。

1 个答案:

答案 0 :(得分:0)

虽然这可能在您通过SSH连接到服务器时起作用。网络服务器用户很可能与您登录的用户不同。 Web服务器在Linux机器上运行的热门用户ID /组是http,www-data,nobody等。

从这一点来说,你有两个选择。

  1. 您可以确保您尝试从PHP运行的脚本(及其所有子项,如果有的话)能够由Web服务器用户运行。

  2. 您可以修改/ etc / sudoers文件,该文件为Web服务器用户提供访问权限,仅提升该脚本的权限。 (注意:这可能会打开安全漏洞,所以要小心)。

  3. 要找出您的网络服务器运行的用户,请执行以下操作:ps aux 查看输出,输出中的第一列列出了该进程正在运行的用户。这是我的一个盒子上的网络服务器(nginx)的摘录:

    www-data 26852 0.0 0.0 29768 3840 ? S Jun04 0:50 nginx: worker process

    您可以在此处看到nginx与用户www-data一起运行。您还可以使用grep执行命令,以帮助您更快地找到该过程。 Grep只会向您显示与您发送的内容相匹配的行。这是一个例子:ps aux | grep nginx

    现在好了,你知道网络服务器正在运行的用户,让我们尝试让该用户访问该脚本。假设您的脚本为foo,位于/usr/local/bin。您将执行以下命令:

    chown www-data /usr/local/bin/foo

    更改文件的所有权后,尝试再次从PHP页面重新运行命令,看看它是否有效。

    为了完整性,我还说过你可以为你的webserver用户提供该文件的sudo权限。为此,您需要将以下行附加到/etc/sudoers文件的底部:

    www-data ALL= NOPASSWD: /usr/local/bin/foo

    然后你的shell_exec命令可以切换到:

    shell_exec('sudo /usr/local/bin/foo');

    请记住,这样做会让您的网络服务器用户以root的形式运行脚本,这在各种情况下都非常危险。但是,相机可能需要提升权限才能工作。我不确定您尝试调用的摄像头设置的权限要求是什么。

    祝你好运。希望这有帮助!