2014-09-22 138 views
0

我们的老师有一个网络服务器,我们被允许测试一些东西。我连接到具有腻子服务器,并试图以下命令:将字符串写入虚拟文件?

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

ttyACM0是虚拟文件重定向流以一个串行接口。这个特定的命令改变rgb led的颜色。但是,同样的命令不会在PHP与execshell_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" 
?> 

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

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

'public_html'建议Apache。 Web服务器用户是否允许写入该文件?此外,缺少错误消息表明您没有配置PHP来显示它们。 – 2014-09-22 15:20:38

回答

1

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

ls -l命令的/ dev/ttyACM0

我想这将是组可写,所以走集团化的说明和检查,如果你的用户的一部分该基团:

然后检查如果HTTP服务器正在运行的用户具有相同的权:

ps aux | 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);

+0

该设备允许'dialout'的所有成员读写(crw-rw ----)。我的用户是这个组的成员。第三条命令的输出对我来说没有任何意义(''STUDENT_NAME 12425 0.0 0.0 13252 924 pts/0 S + 17:37 0:00 grep --color = auto http',http为红色),'error_get_last()'说'失败打开流:权限被拒绝,尽管我是'dialout'的成员,并且它在Putty中为我的用户工作。 – Cubinator73 2014-09-22 16:00:51

+0

我想通过'echo'和'php script_name'通过命令行操作文件,但不能在我的浏览器中操作。 – Cubinator73 2014-09-22 16:26:56

+0

如果通过网络处理文件时缺少什么,所有文件访问都不是由用户完成的,而是通过用户使用Web服务器运行的!上面的ps命令应该会显示除报告的另一行外的其他行,其中第一列将告诉您Web服务器正在使用的用户。如果你在那个用户上运行'groups'命令,它会向你显示这个用户所属的组,我敢打赌_dialout_不会在这些组中出现。 “权限被拒绝”错误清楚地说明了这一点。 – SukkoPera 2014-09-22 16:29:39