我已经设置了LAMP Web服务器,当客户端点击服务器Web界面上的按钮时,我希望在服务器端运行应用程序。此应用程序将按序列号查找某个USB设备,将其打开并向设备发送一个字节数据包。
我有一个index.html,它只有一个按钮,可以调用我的test.php文件,该文件使用shell_exec()来调用我的应用程序。
当通过Web界面调用应用程序时,应用程序会写出错误,指示它无法打开USB设备(这是此应用程序的内置错误,因此应用程序正常工作,它无法找到usb设备)。
但是当我通过终端调用应用程序时,应用程序找到usb设备并写入它没有问题。
我正在寻找一些建议!我正在做什么才是可行的?如果是这样,如何通过Web界面调用应用程序来查找USB设备?我觉得它与权限有关,你永远不知道。
test.php:
<?php
echo shell_exec("/home/pi/FDTI_test/FDTI_test_application");
?>
注意: USB设备已连接,与其驱动程序配合使用,并通过USB连接到服务器。
应用程序在通过服务器端的终端调用时有效,但在通过Web界面调用时则无效。
答案 0 :(得分:1)
我认为你在正确的轨道上是一个权限问题。
在典型的LAMP堆栈中,php进程在apache进程中作为模块运行,除非您以不同方式配置它。在我选择的服务器操作系统中,php进程默认以用户'www-data'运行。
最简单的解决方案可能是为您的网络用户帐户授予sudo权限,并将sudoers文件设置为NOPASSWD。这是非常不安全的,所以只在极少数情况下这样做。
<?php echo shell_exec("sudo /home/pi/FDTI_test/FDTI_test_application"); ?>
下一个最简单的选项是授予Web用户帐户直接写入USB设备的权限。根据您的发行版,您可能只需要add the user到'adm'组。
sudo usermod -a -G adm www-data
同样,这可能不是最安全的方法,但比第一个选项更安全。
最后,您可以查看最难的解决方案,即安装修补版本的apache,允许suexec。这与第二种选择一样不安全,但实施起来要困难得多。 (我会包含指向教程的链接,但我只限于2个链接,因为这是我的第一个答案。)
希望这有帮助!