Записать строку в виртуальный файл?

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

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

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

0

Решение

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

ls -l / dev / ttyACM0

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

группы

Затем проверьте, имеет ли пользователь, на котором запущен HTTP-сервер, такое же право:

PS Aux | grep http

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

группы 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);

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]