2014-09-22 142 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