Как запустить скрипт Python из Apache на Raspberry Pi?

#python #apache #shell #raspberry-pi #raspbian

Вопрос:

Итак, на Raspberry Pi я использую приложение для камеры с веб-интерфейсом, я хотел добавить светодиодное освещение, добавив неопиксель. Я успешно сделал это и теперь могу включать и выключать его, запустив два скрипта python.

Объяснение и вопрос:

У меня есть скрипт на python /usr/local/bin , который является исполняемым.
Он принадлежит «корневому корню«.

У меня есть скрипт оболочки /var/www/html/macros , который является исполняемым и должен запускать скрипт python /usr/local/bin . Сценарий оболочки принадлежит «www-data»

Когда я вручную запускаю файл python, он выполняет сценарий.
Когда я вручную запускаю сценарий оболочки, он выполняет сценарий python.

Когда я запускаю сценарий оболочки, нажав на кнопку на своей веб-странице, кажется, что сценарий оболочки выполняется правильно, однако похоже, что он не выполняет сценарий python.
Что я могу сделать, чтобы исправить это?

Я не очень разбираюсь в разрешениях, но я хотел бы подчеркнуть тот факт, что это закрытая система, которая не содержит никакой конфиденциальной информации. Таким образом, безопасность/наилучшая практика не являются проблемой. Я просто хочу, чтобы это сработало.

Ответ №1:

Я не эксперт в этой области, но я считаю, что для доступа /usr/local/bin/ вам нужны root привилегии, что объясняет, почему вы добиваетесь успеха, но не Apache.

Вместо того, чтобы предоставлять root разрешения Apache, лучше просто удалить требование из отдельного файла, который вы хотите выполнить. Это может быть достигнуто путем

 $ cd /usr/local/bin
$ sudo chmod 777 your_script.py
 

Комментарии:

1. Спасибо, что подумали, мы нашли проблему и обходной путь, я обновлю комментарий. Это была настоящая поездка.

Ответ №2:

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

Проблема оказалась в том, что веб-интерфейс может выполняться только как «www-данные», а библиотека NeoPixel, от которой зависит скрипт python, должна выполняться как sudo/root.

Эти два фактора делают так, что никогда не будет прямого способа заставить сценарии работать вместе.

Однако возникла идея использовать какую-то трубу.

Блестящий пользователь предложил мне использовать sshpass. Это позволило бы передавать данные по ssh и, по сути, выполнять их от имени пользователя root.

Данные из веб-интерфейса будут переданы в sshpass, и это позволит успешно запустить необходимые сценарии с необходимыми привилегиями.

Особая благодарность Минти Требор и Фальконе из RRF за раздор LPC/STM!