【问题标题】:Executing a command line using php shell_exec() for initiating a camera on the server使用 php shell_exec() 执行命令行以在服务器上启动摄像头
【发布时间】:2012-03-13 16:18:39
【问题描述】:

我正在使用 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 网络浏览器运行这个 php 文件时,我想启动相机并捕捉图像,但执行时会抛出上述错误。

【问题讨论】:

  • 您将所有输出重定向到 /dev/null,因此不会返回任何内容。
  • 好的...现在我删除了 /dev/null 部分...错误消失了....bt 仍然没有在服务器上启动相机(arch)...。
  • 网络服务器用户是否有权执行该文件?
  • 是....服务器用户可以执行该操作....我通过服务器的终端执行该操作..从终端执行 LD_LIBRARY_PATH=usr/local/lib ./a.out 0 ...并且效果很好...相机被初始化并捕获了图像...也只有一个用户...而且它的管理员有完整的执行权限...问题是当我尝试使用 php shell_exec 命令执行它..在客户端上运行后,它应该在服务器上启动摄像头......这就是我期望使用 php 做的事情..
  • 此外,现在我已经为 php 文件赋予了 chmod 777 权限...只是认为它可能有权限问题...bt 没用....卡住了..

标签: php shell opencv archlinux


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 2016-03-01
    • 2013-01-01
    • 2018-05-26
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2011-04-05
    相关资源
    最近更新 更多