Выполнить скрипт Python из переполнения стека

У меня есть веб-страница PHP на моем Raspberry Pi с 2 кнопками (вкл и выкл)
Кнопка включения перенаправляет на On.php
Кнопка выключения перенаправляет на Off.php
В «/ usr / lib / cgi-bin» у меня есть скрипт на python, который я хотел бы выполнить (script.py)
Я могу отлично выполнить его из терминала, набрав

cd /usr/lib/cgi-bin
sudo python script.py

Это работает, если я делаю это из терминала.

Проблема в том, что файл PHP (On.php) находится в моей папке «/ var / www».
Вот что я написал:

<?php
exec('cd /usr/lib/cgi-bin');
exec('sudo python script.py');
?>

Почему скрипт выполняется из терминала, а не из моего PHP?

11

Решение

Вы не можете использовать sudo из PHP-скрипта. Apache запускается от пользователя (как правило, www-data), поэтому отредактируйте этот файл: /etc/sudoers

Затем добавьте эту строку:

www-data ALL=(ALL) NOPASSWD:ALL

Уход ! это позволит авторизовать все функции, вызываемые PHP-скриптом, вы можете адаптировать изменение «ALL» вашим скриптом или командой Python.

Затем укажите своего пользователя в вашей команде exec:

<?php
exec('sudo -u www-data python /usr/lib/cgi-bin/script.py')
13

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

Попробуйте это, это должно работать:

<?php
system("cd /usr/lib/cgi-bin");
system("sudo python script.py");
?>

Или даже это:

<?php
system("cd /usr/lib/cgi-bin && sudo python script.py");
?>
3

В старом дистрибутиве Raspbian вы должны поместить свой файл в /var/www/file.py, Итак, в вашем file.php вы добавляете:

{
exec("sudo python /var/www/file.py");
}

На более новой Raspbian Jessie вы должны поместить свой файл в /var/www/html/file.py, так что в вашем file.php вам нужно добавить:

{
exec("sudo python /var/www/html/file.py");
}

Или просто любой file.py

<?php
{
exec("sudo python test.py");
}

?>

Примечание. Чтобы это работало, сначала нужно отредактировать файл, добавив эти строки, чтобы разрешить sudo без пароля.

sudo nano /etc/sudoers

затем перейдите на дно и добавьте это

pi ALL=(ALL) NOPASSWD: ALL<br>
www-data ALL=(ALL) NOPASSWD: ALL
2
По вопросам рекламы [email protected]