Я пытаюсь выполнить скрипт php, но у меня возникают такие ошибки:
Warning: file_put_contents(/sys/class/gpio/export): failed to open stream: Permission denied in /home/pi/php-gpio/src/PhpGpio/Gpio.php on line 99
Warning: file_put_contents(/sys/class/gpio/gpio17/direction): failed to open stream: Permission denied in /home/pi/php-gpio/src/PhpGpio/Gpio.php on line 103
Я попытался настроить разрешение в $ sudo visudo следующим образом:
www-data ALL=NOPASSWD: path/to/my/script
или же
www-data ALL=NOPASSWD: ALL
но не работает, я могу выполнить этот скрипт только с sudo из командной строки!
Заранее спасибо!
Если вы используете на своем компьютере, вы должны изменить разрешение каталога по умолчанию:
$ sudo chmod -R +w /sys/class/gpio/export
в противном случае, если вы запускаете код на сервере, в панели сервера и в файлах разделов (например, CPanel), измените разрешение и добавьте право записи.
Другой способ — запустить команду exec ():
<?php
exec('chmod -R +w /sys/class/gpio/export');
?>
Тем не мение, PHP должен иметь право exec и работать с рутом!
Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash (как root, если требуется), он решает ограничения exec () и shell_exec (). Получи это здесь: https://github.com/merlinthemagic/MTS
После загрузки вы просто используете следующий код:
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1 = $shell->exeCmd('/sys/class/gpio/export');
$return2 = $shell->exeCmd('/sys/class/gpio/gpio17/direction');
//the return will be a string containing the return of the command
echo $return1;
echo $return2;
С точки зрения безопасности это намного лучше, чем запускать Apache от имени root или широко открытые разрешения sudo в вашем вопросе. Но позволить PHP где-нибудь рядом с root всегда сложно.
Проект, который я построил, достигает оболочки root bash одним из двух способов:
1) Вы разрешаете apache право на sudo python.
ИЛИ ЖЕ
2) Вы передаете учетные данные пользователя root каждый раз, когда вам нужна оболочка с настройкой root.
Выбрать свой яд. 🙂 Прочтите документацию.