2

我正在使用 opencv 在我的 Arch linux 上启动摄像头。当我实际从服务器本身的命令行执行此操作时,它会启动并且运行良好。我想使用 php 初始化它。我尝试使用shell_execPHP 进行操作。

我的 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 文件时,我想启动相机并捕获图像,但是在执行时它会抛出上述错误。

4

1 回答 1

0

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

从这一点开始,您有两个选择。

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

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

要找出您的网络服务器运行的用户,请执行以下操作: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 页面再次重新运行您的命令,看看它是否有效。

为了完整起见,我还说您可以授予您的网络服务器用户 sudo 对该文件的权限。为此,您需要将以下行附加到/etc/sudoers文件底部:

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

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

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

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

祝你好运。希望这可以帮助!

于 2012-06-18T22:33:52.300 回答