2015-08-04 3 views
10

У меня есть PHP веб-страницы на моем Raspberry Pi с 2-мя кнопками (включения и выключения) на кнопку включения Кнопка перенаправляет On.php Кнопка выключения перенаправляет Off.php В «/ USR/Библиотека/CGI-BIN»у меня есть питон скрипт, который я хотел бы, чтобы выполнить (script.py) я могу отлично выполнить его из терминала, введяВыполнить скрипт Python из Php

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?

+0

Есть ли у вашей супер пользователя пароль? –

ответ

12

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

Затем добавьте следующую строку:

www-data ALL=(ALL) NOPASSWD:ALL 

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

Тогда точный ваш пользователь в вашей команде ехес:

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

Удаляет ли это пароли? Потому что у меня есть порт сервера, перенаправленный публично. Я бы не хотел, чтобы кто-то просто заходил на мой сервер. – ChubbyChocolate

+0

Он удалит пароль пользователя www-data, поэтому вы можете запросить NOPASSWD для некоторой команды, например 'NOPASSWD: python'. Это не изменит что-то для других пользователей. –

+0

Хорошо, я не эксперт, я просто хотел убедиться, что никто не сможет взломать мою малину в качестве суперпользователя или любого другого пользователя. – ChubbyChocolate

3

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

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

Или даже так:

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

На старше Распространение 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 nano /etc/sudoers

затем на дно и добавить

pi ALL=(ALL) NOPASSWD: ALL<br> 
www-data ALL=(ALL) NOPASSWD: ALL 
+0

Никогда не добавляйте www-данные в sudoers с помощью 'NOPASSWD: ALL'! Это может стать очень большой проблемой безопасности. См. Комментарий @ dotslash выше – Dartmouth

+0

yes is can, если он в сети, это pi - просто удаленный дом, который является всем. Для людей, которые читают, не делайте этого, чтобы контролировать интернет – Code1

+0

Итак? Если он подключен к сети, он может быть скомпрометирован, если кто-то пытается достаточно сильно. Только не делай этого. Есть лучшие способы, такие как ответ Альберто Пагани. – Dartmouth