使用 php shell_exec() 执行命令行以启动服务器上的相机


Executing a command line using php shell_exec() for initiating a camera on the server

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

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

从这一点来看,您有两种选择。

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

  2. 您可以修改/etc/sudoers 文件,该文件仅授予 Web 服务器用户提升该脚本权限的权限。(注意:这可能会打开安全漏洞,因此请小心(。

要找出您的网络服务器以哪个用户运行,请执行以下操作: 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

好的,既然您知道 Web 服务器以哪个用户身份运行,让我们尝试授予该用户对脚本的访问权限。假设您的脚本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运行脚本,这在各种情况下都是非常危险的。但是,相机可能需要提升的权限才能工作。我不确定您尝试调用的相机设置的权限要求是什么。

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