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

使用php shell_exec()执行命令行以启动服务器上的摄像头,php,shell,opencv,archlinux,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; ?> 它给出以下输出: 错误:捕获为空 我以客

我正在使用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;
?>
它给出以下输出: 错误:捕获为空

我以客户机的身份通过windows web浏览器运行此程序,opencv和相关文件位于我的arch linux服务器上


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

,而这可能会在服务器中运行。Web服务器用户很可能与您登录的用户不同。Web服务器在Linux机器上运行的常用用户ID/组有http、www数据、nobody和其他

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

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

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

要了解您的Web服务器以什么用户身份运行,请执行以下命令:ps aux 查看输出,输出中的第一列列出了运行该进程的用户。下面是我的一个盒子上我的Web服务器nginx的摘录:

www.data 26852 0.0 0.0 29768 3840?S Jun04 0:50 nginx:工作进程

您可以在这里看到nginx与用户www数据一起运行。您还可以使用grep执行命令,以帮助您更快地找到流程。Grep将只显示与您发送给它的内容相匹配的行。这里有一个例子:ps aux | grep nginx

好了,现在您已经知道Web服务器运行时的用户身份,让我们尝试让该用户访问脚本。假设您的脚本是foo,位于/usr/local/bin中。您可以执行以下命令:

周恩来www.data/usr/local/bin/foo

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

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

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

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

shell_exec'sudo/usr/local/bin/foo'

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


祝你好运。希望这有帮助

而这可能会在您登录到服务器时起作用。Web服务器用户很可能与您登录的用户不同。Web服务器在Linux机器上运行的常用用户ID/组有http、www数据、nobody和其他

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

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

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

要了解您的Web服务器以什么用户身份运行,请执行以下命令:ps aux 查看输出,输出中的第一列列出了运行该进程的用户。下面是我的一个盒子上我的Web服务器nginx的摘录:

www.data 26852 0.0 0.0 29768 3840?S Jun04 0:50 nginx:工作进程

您可以在这里看到nginx与用户www数据一起运行。您还可以使用grep执行命令,以帮助您更快地找到流程。Grep将只显示与您发送给它的内容相匹配的行。这里有一个例子:ps aux | grep nginx

好了,现在您已经知道Web服务器运行时的用户身份,让我们尝试让该用户访问脚本。假设您的脚本是foo,位于/usr/local/bin中。您可以执行以下命令:

周恩来www.data/usr/local/bin/foo

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

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

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

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

shell_exec'sudo/usr/local/bin/foo'

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


祝你好运。希望这有帮助

您正在将所有输出重定向到/dev/null,所以不会返回任何内容。好的…现在我删除了/dev/null部分…错误消失了…bt仍然没有在serverarch上启动摄像头…Web服务器用户有权执行该文件吗?是的…服务器用户可以执行该文件…我通过服务器的终端执行了该操作..执行了LD_LIBRARY_PATH=usr/local/lib./a.out 0从终端…它工作正常…摄像头初始化并捕获图像…而且只有一个用户…其管理员因此具有完全的执行权限…问题是当我尝试使用php shell_exec命令执行它时..在客户端上运行后,它应该在客户端上启动摄像头服务器…这就是我希望使用php所做的..另外,现在我给了php文件chmod 777权限…只是认为它可能有权限问题…bt没有用…卡住了..您正在将所有输出重定向到/dev/null,所以不会返回任何内容。好的…现在我删除了/dev/null部分…错误消失了…bt仍然没有在serverarch上启动摄像头…Web服务器用户有权执行该文件吗?是的…服务器用户可以执行该文件…我通过服务器的终端执行了该操作..执行了LD_LIBRARY_PATH=usr/local/lib./a.out 0从终端…它工作正常…摄像头初始化并捕获图像…而且只有一个用户…其管理员因此具有完全的执行权限…问题是当我尝试使用php shell_exec命令执行它时..在客户端上运行后,它应该在客户端上启动摄像头服务器…这就是我希望使用php所做的。此外,现在我已经给了php文件chmod 777权限…只是认为它可能有权限问题…bt没有用…仍然卡住。。