Права доступа к PhpSerial из Apache
Есть сервер на Armbian. На нем стоит Apache и PHP Version 8.1.2-1ubuntu2.11. Простая страничка html
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<meta charset="utf-8">
</head>
<body>
<h2>Введи свои данные:</h2>
<form action="com_port.php" method="POST">
<p>Введите имя: <input type="text" name="firstname" /></p>
<p>Введите фамилию: <input type="text" name="lastname" /></p>
<input type="submit" value="Отправить">
</form>
</body>
</html>
и PHP файл
<?php
//phpinfo();
echo " Point ---";
hello();
function hello()
{
include "PhpSerial.php";
echo " Point1";
$serial = new PhpSerial;
echo "Point2";
$serial->deviceSet("/dev/ttyUSB0");
echo "Point 3";
$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");
$serial->deviceOpen();
echo "Pount 4";
$serial->sendMessage( "Privet" );
$serial->deviceClose();
};
При запуске файла com_port.php с консоли под root, он выполняется и в com-port отсылается "Privet".

При запуске с консоли под пользователем, только через sudo работает.
Через сайт не работает отсылка в com-port. Останавливается на echo " Point1";

error.log [Sun Jun 04 20:15:54.029082 2023] [php:error] [pid 1720] [client 192.168.5.119:6334] PHP Fatal error: No stty availible, unable to run. in /var/www/html/PhpSerial.php on line 60, referer: http://192.168.5.120/
Похоже не хватает каких-то прав.
Ответы (2 шт):
Проблема, с которой вы столкнулись, связана с ограничениями прав доступа, когда ваш PHP-скрипт запускается через веб-сервер Apache. Ошибка "No stty available, unable to run" указывает на то, что функция stty не доступна из-за ограничений безопасности.
Чтобы решить эту проблему, вам необходимо предоставить правильные разрешения для пользователя, под которым работает веб-сервер. Это можно сделать, добавив пользователя www-data (или другой пользователь Apache) в группу, которая имеет права на выполнение команды stty. Или же вы можете явно предоставить необходимые права.
Еще один вариант - использовать udev правила для предоставления доступа к устройству (в данном случае /dev/ttyUSB0) пользователю www-data или группе, к которой он принадлежит. Создайте файл /etc/udev/rules.d/99-usb-serial.rules и добавьте в него следующее содержимое:
KERNEL=="ttyUSB0", GROUP="www-data", MODE="0660"
Затем перезагрузите udev или выполните sudo udevadm control --reload-rules.
Также можно использовать исполняемый файл SUID, чтобы предоставить права выполнения команды stty. Создайте отдельный исполняемый файл, который будет выполнять только эту команду, и установите setuid-биты для этого файла. Пожалуйста, имейте в виду, что это может повлечь уязвимости безопасности, поэтому будьте осторожны при использовании этого метода.
После того как вы реализуете одно из этих решений, ваш PHP-скрипт должен получить доступ к выполнению команды stty, и проблема будет решена.
Итогом оказалось, что нужно было для Apache создать пользователя и поместить его в группу dialout. И так-же дать пользователю доступ на папки var/www
