2014-09-22 3 views
0

Наш учитель имеет веб-сервер, и нам разрешено проверять некоторые вещи. Я подключен к серверу с Putty и попытался следующей командой:Запись строки в виртуальный файл?

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

ttyACM0 представляет собой виртуальный файл перенаправление потока в последовательный интерфейс. Эта конкретная команда изменяет цвет управляемой строки. Но та же команда не работает в PHP с exec или 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")
  • Есть ли лучшее решение?
+1

'public_html' предлагает Apache. Пользователю веб-сервера разрешено записывать в этот файл? Кроме того, отсутствие сообщений об ошибках предполагает, что вы не настроили PHP для их отображения. –

ответ

1

Когда вы работаете над файлом через Интернет, все обращения к файлам выполняются через пользователя, на котором работает веб-сервер, который, вероятно, отличается от пользователя, которого вы входите, как через PuTTY. Таким образом, вы можете столкнуться с проблемой разрешения. Проверьте разрешения на TTY устройства:

Ls -l/DEV/ttyACM0

Я предполагаю, что это будет группа перезаписываемых, так что принять к сведению группу и проверить, если ваш пользователь является частью что группа:

группы

Затем проверьте, если пользователь сервер HTTP работает как имеет такое же право:

ps aux | Grep HTTP

Это должно показать список всех процессов, содержащих HTTP на их имя, а веб-сервер, вероятно, будет среди них. Определите его, и первый столбец соответствующей строки сообщит вам пользователя, которого использует веб-сервер. Предположим, что это apache. Теперь запустите:

группа APACHE

(Или что вы обнаружили на предыдущем этапе) Это покажет вам группу принадлежит пользователю, и я поставил группу ttyACM0 принадлежит не будет среди те. Вам нужно будет попросить sysadmin добавить пользователя в группу.

В любом случае использование shell_exec в этом контексте - очень плохая практика. Я думаю, вы можете просто открыть последовательное устройство и писать:

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

Конечно, это не будет работать, если пользователь HTTP-сервер не имеет прав на запись в устройство.Кроме того, не забудьте обратить внимание на завершение линии в fwrite(), возможно, вам это понадобится или нет, или даже нужно другое (или \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() 'говорит' failed открыть поток: Permission denied', хотя я являюсь участником «dialout», и он работал для моего пользователя в Putty. – Cubinator73

+0

Я понял, что могу манипулировать файлом через командную строку с помощью 'echo' и' php script_name', но не в моем браузере. – Cubinator73

+0

Что вам не хватает, если при работе с файлом через Интернет все обращения к файлам не выполняются вашим пользователем, а через пользователя, на котором работает веб-сервер! Команда ps выше должна отображать другую строку, кроме той, о которой вы сообщали, чей первый столбец сообщит вам пользователя, которого использует веб-сервер. Если тогда вы запустите команду «groups» этого пользователя, он покажет вам группы, к которым принадлежит пользователь, и я уверен, что _dialout_ не будет среди них. Очевидно, это говорит об ошибке «Разрешение отказа». – SukkoPera

Смежные вопросы