Мне трудно получить веб-форму для запуска сценария CGI, который должен выполнять команду с правами root. Форма такая:
<form class="mainform" action="./py/print_msg.py" method="POST">
<textarea name="post" cols=70 rows=20></textarea><br>
<input type="submit" value="Print" class="button">
<input type="reset" value="Clear" class="button">
</form>
Скрипт Python print_msg.py исполняемый (-rwxr-xr-x 1 root root
) и версия, которая просто выводит строки в браузер, работают нормально, поэтому настройки CGI apache кажутся нормальными.
#!/usr/bin/env python
from Adafruit_Thermal import *
print "Content-type: text/html\n\n"
printer = Adafruit_Thermal("/dev/ttyAMA0", 19200, timeout=5)
printer.wake()
time.sleep(1)
print "test"
printer.sleep()
Это работает, когда его запускает root. Я редактировал /etc/sudoers
следующим образом:
www-data ALL=(ALL) NOPASSWD: /usr/bin/sudo -u root /home/pi/www/html/py/print_msg.py
Не уверен, означает ли это, что www-data может запускать этот скрипт от имени пользователя root, или он будет делать это без необходимости вызывать sudo
? Теперь, когда я вызываю страницу, я получаю:
Traceback (most recent call last):
File "/var/www/html/py/print_msg.py", line 7, in <module>
printer = Adafruit_Thermal("/dev/ttyAMA0", 19200, timeout=5)
File "/home/pi/www/html/py/Adafruit_Thermal.py", line 73, in __init__
Serial.__init__(self, *args, **kwargs)
File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 261, in __init__
self.open()
File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 278, in open
raise SerialException("could not open port %s: %s" % (self._port, msg))
serial.serialutil.SerialException: could not open port /dev/ttyAMA0: [Errno 13] Permission denied: '/dev/ttyAMA0'
[Wed Jun 01 13:50:04.383712 2016] [cgid:error] [pid 30345:tid 2993681456] (104)Connection reset by peer: [client 192.168.1.158:51239] AH02550: Failed to flush CGI output to client, referer: http://192.168.1.174/
Возможно, у меня нет нужной строки sudoers? Благодарен за помощь.
Если вы не хотите запрашивать root-доступ каждый раз, когда вам нужно установить это: https://github.com/quick2wire/quick2wire-gpio-admin
#!/usr/bin/env python
from Adafruit_Thermal import *
print "Content-type: text/html\n\n"
printer = Adafruit_Thermal("/dev/ttyAMA0", 19200, timeout=5)
printer.wake()
time.sleep(1)
print "test"
printer.sleep()
CGI
вне ! (Задержка 0,1 секунды приведет к повреждению ваших данных)Как это :
import cgi # Maybe need form value etc.
form = cgi.FieldStorage()
myVar = "Failed : "
def myHandler(myVar = myVar):
try :
#Do stuf here !
myVar = myContent
except Exception,e :
myVar += str(e)
myHandler()#we don't need any arguments !
print "Content-Type: text/html;charset=utf-8;" # What is your ContentType ?
print "Access-Control-Allow-Origin:*"
print
print myVar
Это основная блок-схема (не используйте ее таким образом, не закрепив ее)