0

我们的老师有一个网络服务器,我们可以测试一些东西。我用 Putty 连接到服务器并尝试了以下命令:

echo "i 4 r 255 g 0 b 0." > /dev/ttyACM0

ttyACM0是将流重定向到串行接口的虚拟文件。此特定命令更改 rgb LED 的颜色。但是相同的命令在 php 中不起作用execor shell_exec

<?php
    // Script saved at /home/STUDENT_NAME/public_html/blink.php
    echo shell_exec("echo \"i 4 r 255 g 0 b 0.\" > /dev/ttyACM0"); // Doesn't work
    echo shell_exec("echo \"Hello\""); // Returns "Hello"
?>

我知道这一点exec并且shell_exec没有被禁用,因为第二次调用shell_exec有效。我的下一个想法是使用fopen("php://memory", "a");,但我不知道如何使用这些包装器。所以我的问题:

  • 如何正确使用这些包装器?(也许像"php://memory/dev/ttyACM0"
  • 有更好的解决方案吗?
4

1 回答 1

1

当您通过 Web 处理文件时,所有文件访问都是通过运行 Web 服务器的用户执行的,这可能与您通过 PuTTY 登录的用户不同。因此,您可能会遇到权限问题。检查 tty 设备上的权限:

ls -l /dev/ttyACM0

我想这将是组可写的,因此请记下该组并检查您的用户是否属于该组:

团体

然后检查运行 HTTP 服务器的用户是否具有相同的权限:

ps辅助| grep http

这应该显示名称中包含http的所有进程的列表,并且 Web 服务器可能在其中。识别它,相应行的第一列将告诉您 Web 服务器正在使用的用户。假设它是apache。现在运行:

组阿帕奇

(或者您在上一步中发现的任何内容)这将向您显示用户所属的组,我敢打赌 ttyACM0 所属的组不会在其中。您需要让系统管理员将用户添加到组中。

无论如何,shell_exec在这种情况下使用是非常糟糕的做法。我认为您可以打开串行设备并对其进行写入:

$fp = fopen ("/dev/ttyACM0", "w");
fwrite ($fp, "i 4 r 255 g 0 b 0.\n");
fclose ($fp);

当然,如果 HTTP 服务器用户没有写入设备的权限,这将不起作用。另外,请务必注意 中的行终止fwrite(),您可能需要或不需要,甚至需要不同的(\r\r\n);

于 2014-09-22T15:19:26.503 回答