1

我已经设置了一个 LAMP Web 服务器,当客户端单击服务器 Web 界面上的按钮时,我希望在服务器端运行一个应用程序。此应用程序将通过序列号查找某个 USB 设备,打开它并向设备发送一个字节数据包。

我有一个 index.html,它只有一个按钮,可以调用我的 test.php 文件,该文件使用 shell_exec() 来调用我的应用程序。

当通过Web界面调用应用程序时,应用程序写出一个错误,表明它无法打开USB设备(这是这个应用程序的内置错误,所以应用程序可以工作,它只是找不到USB设备) .

但是当我通过终端调用应用程序时,应用程序会找到 USB 设备并写入它没有问题。

我正在寻找一些建议!简单地说,我正在做的事情可行吗?如果是这样,我怎样才能让应用程序在通过 Web 界面调用时找到 USB 设备?我感觉它与权限有关,你永远不知道。

测试.php:

<?php echo shell_exec("/home/pi/FDTI_test/FDTI_test_application"); ?>

注意:USB 设备已连接,与它的驱动程序配合得很好,并通过 USB 连接到服务器。

该应用程序在通过服务器端的终端调用时有效,但在通过 Web 界面调用时无效。

4

1 回答 1

1

我认为你在正确的轨道上,这是一个权限问题。

在典型的 LAMP 堆栈中,php 进程作为 apache 进程中的模块运行,除非您对其进行了不同的配置。在我选择的服务器操作系统中,php 进程默认以用户“www-data”的身份运行。

可能最简单的解决方案是为您的网络用户帐户授予 sudo 权限,并将 sudoers 文件设置为NOPASSWD。这是非常不安全的,所以只在极少数情况下这样做。

<?php echo shell_exec("sudo /home/pi/FDTI_test/FDTI_test_application"); ?>

下一个最简单的选项是授予 Web 用户帐户直接写入 USB 设备的权限。根据您的发行版,您可能只需要将用户添加到“adm”组。

sudo usermod -a -G adm www-data 

同样,这可能不是最安全的方法,但比第一个选项更安全。

最后,您可以研究最难的解决方案,即安装允许 suexec 的 apache 补丁版本。这与第二种选择一样不安全,但实施起来要困难得多。(我会包含一个教程的链接,但我仅限于 2 个链接,因为这是我的第一个答案。)

希望这可以帮助!

于 2013-07-31T21:04:37.400 回答