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

标签 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;
?>

它给出了这个输出: 错误:捕获为 NULL

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

当我从 Windows 网络浏览器运行此 php 文件时,我想启动相机并捕获图像,但在执行时它会抛出上述错误。

最佳答案

当您通过 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:工作进程

这里可以看到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 身份运行脚本,这在各种情况下都非常危险。但是,相机可能需要更高的权限才能工作。我不确定您尝试调用的相机设置的权限要求是什么。

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

关于php - 使用 php shell_exec() 执行命令行以启动服务器上的摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9687884/

相关文章:

opencv - 多个应用程序访问同一个 DeckLink 设备(openCV 和 rtmp 推送)?我有什么选择?

php - 我如何使用 php 在选择框中突出显示选项值

linux - 无法使用SED命令

ubuntu - 安装 php-pear 并更新 memcache 后 Nginx 失败

linux - 在 flash 文件中调用 shell 命令

c# - 尝试从 Chrome 实现拖放 Gmail 附件

python - 如何建立值(value)观之间的关系?

python - OpenCV/Python - 从灰度图像中查找灰度图案矩形的角坐标?

php - WordPress - 列出具有特定 meta_key 值的自定义类型

php - 简单解释html DOM树>子节点概念