我正在使用 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 和其他。
此时您有两个选择。
您可以确保您尝试从 PHP 运行的脚本(及其所有子脚本,如果有的话)能够由网络服务器用户运行。
您可以修改您的/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/