Pythonskript über PHP starten

  • Hallo,


    ich habe folgendes Problem: ich versuche über eine Website, die auf meinem Apache-Server ist und mit PHP geschrieben wurde, ein python-skript auszuführen. Aber die shell-befehle mit sudo lassen sich nicht ausführen. Klar ist dass ich mit dem user www-data keine sudo befehle ohne passwort ausführen darf. deswegen hab ich über visudo in sudosers folgendes geschrieben:


    Code
    www-data ALL=(root) NOPASSWD: /var/www/LED_an.py
    www-data ALL=(root) NOPASSWD: /var/www/LED_aus.py


    danach neugestartet und getestet aber es funktioniert nicht. die Skripte funktionieren alle einzeln. und ich bekomme auf der Website auch die antwort auf "whoami". also funktioniert ja das grundprinzip.
    könnt ihr mir jetzt helfen? vielleicht noch einen Tipp geben was ich noch versuchen könnte?


    ich habe die skripte mal angehängt:





    Code
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(26, GPIO.OUT)
    GPIO.output(26, True)




    Code
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(26, GPIO.OUT)
    GPIO.output(26, False)
  • Hallo lord.ich,


    Code
    echo shell_exec("sudo python /var/www/LED_an.py");


    Du rufst damit nicht "/var/www/LED_an.py" bzw. "/var/www/LED_aus.py" auf sondern "python". Deine Einträge in der sudoers werden also nicht funktionieren. Das kannst du aber auch mal ausprobieren indem du eine Shell mit dem Benutzer www-data öffnest und versuchst die Skripte zu starten.


    Gruß Georg

  • ok ich verstehe was du meinst. ich habe jetzt mal als test in sudoers folgendes geschrieben:


    Code
    www-data ALL=(root) NOPASSWD: /usr/bin/python


    damit funktioniert es. da habe ich wohl das sudoers falsch verstanden. Das große ABER ist bei dieser variante doch dass www-data jetzt alle python skripte ausführen kann. das ist ja ein erhebliches sicherheitsrisiko oder?
    gibt es eine möglichkeit das noch einzuschränken auf vereinzelte skripte? wie bei mir 'LED_an.py' und 'LED_aus.py'?


    GROßES DANKE aber ersteinmal für deine hilfe.


    Tasty: ja das ist auch eine gute möglichkeit soweit bin ich mit PHP noch nicht. danke dafür das werde ich mal mit in betrcht ziehen. aber ich will erstmal grundlegend vom internet aus ein skript auf den Raspi starten.

  • Ich fürchte dass das scriptbezogen nicht geht ( siehe hier oder auch hier ).
    Das ist zwar jetzt auf PHP bezogen, aber da Python ja auch eine Interpreter-Sprache ist dürfte das Verhalten dasselbe sein.


    Einzige Möglichkeit die ich sehe ist, die zwei scripte "ein" und "aus" in C zu schreiben und dann mit dem S-Bit zu arbeiten.


    bye,
    -ds-

  • Hallo zusammen,


    warum fügst du nicht die Shebang für Python in das Skript ein und machst es direkt ausführbar?


    Code
    #!/usr/bin/env python


    Somit kannst du dir den Aufruf über "python" sparen und auch den direkten Skriptpfad verwenden welcher sich auch in der sudoers eintragen lässt.


    Gruß Georg


  • Hallo Georg,


    und das funktioniert? Hab' ich jetzt nicht gewusst, nie was von gehört aber dafür wieder mal was dazugelernt :) .
    Ginge das auch mit PHP?
    Hast Du da evtl. auch so eine Tricki-Idee mit PHP + WebServer?


    ciao,
    -ds-


  • Danke,
    das werde ich mal probieren, nur fürchte ich, dass das nur für PHP-scripte funktioniert, die Du von der Konsole aus aufrufst.
    Beim Webserver läuft das doch über das (Webserver-/Apache-) Plugin oder täusche ich mich da?


    Diese Hashbang-Geschichte kannte ich nur von shell-scripts ...


    EDIT: Hat sich erledigt. Hab' gerade was dazu im Web gefunden. Scheint auch zu funktionieren. Hängt irgendwie mit cgi zusammen. Muss ich bei Gelegenheit mals ausprobieren.


    Danke nochmal,
    bis demnächst ...


    cu,
    -ds-

  • Hallo,


    danke für die zahlreichen antworten.
    aber ich versteh das mit der Shebang noch nich so recht. Ich versteh das so: die shebang ruft python auf und führt den code aus. also muss ich den python code direkt in das php-skript schreiben oder wie? oder wie findet dann der aufruf meines python-skriptes statt? mir würden ein paar zeile code zum verstehen sehr helfen.


    grüße lord.ich

  • Hallo lord.ich,


    in dein Python-Skript wird ganz am Anfang die folgende Zeile eingefügt (vorausgesetzt du hast noch keine Shebang).


    Code
    #!/usr/bin/env python


    Anschließend machst du das Skript mit "chmod 0755 script.py" ausführbar (Dateiname entsprechend anpassen).


    In deinem PHP-Skript schreibst du jetzt nicht mehr ...


    Code
    echo shell_exec("sudo python /var/www/LED_aus.py");


    sondern dafür ...


    Code
    echo shell_exec("sudo /var/www/LED_aus.py");


    In der sudoers musst du natürlich www-data den Zugriff auf die "/var/www/LED_aus.py" erlauben.


    Gruß Georg

  • Ein ganz GROßES DANKESCHÖN an boandlkramer!!!
    es funktioniert und nun ist es auch halbwegs sicher würde ich mal meinen, da ich nun ja unter kontrolle hab welches python skript ausgeführt werden darf.


    ok dann würde ich das thema hier mal schließen.


    Danke nochmal an alle.

  • Hallo
    Ich benötige dringend Hilfe, sonst drehe ich noch durch.
    Seit einer Woche zerbreche ich mir den Kopf aber
    bei mir lässt sich ein Python Script mittels html/php immer noch nicht starten.
    in /etc/sudoers "www.data ALL="ALL" NOPASSWD: ALL" die sudo-rechte für www.date freigegeben.
    das Python-Script liegt auf /var/www/P_Test.py
    die html/php-Seite liegt auch dort


    Eine LED von der HTML(PHP)-Seite aus, ohne Python, anzusteuern funktioniert.


    Den HTML/PHP code habe ich von dieser Seite.


    Mit "sudo /var/www/P-Test.py" in die Shell eingeben, funktioniert das Programm d.h. die Shebang-
    Zeile müsste auch stimmen, da ich das Programm in der Shell nicht angeben muss.


    Im PHP-Code habe ich als Adresse echo shell_exec("sudo /var/www/P_Test.py"); eingegeben.


    ansonsten ist das HTML/PHP Script von dieser Seite kopiert.


    Habe auch schon andere PHP Scripte ausprobiert. Keines ruft mir mein Python-Programm auf.


    Wenn mir jemand helfen könnte wäre ich sehr dankbar


    mfg Lordjojo


    ps. ich bin Anfänger

  • Hey,


    Bin mir nicht sicher, aber bei mir steht in /etc/sudoers statt www.data www-data.


    Musst mal überprüfen wie der webserver Nutzer bei dir heißt. Glaube bei Apache ist es normalerweise www-data

  • Vielen vielen Dank
    Hatte statt eines Bindestriches einen Punkt eingegeben und es Tagelang überlesen.
    Das ganze hat mich viele Graue Haare gekostet (Betriebs-blind).
    Nochmals besten Dank

  • Hallo habe ein Problem und zwar versuche genau wie oben ein Script via php auszuführen allerdings funktioniert es garnicht ! ich bin in der linux welt relativ neu deshalb schindet mich nicht direkt bis zum Abgrund bitte. Ich versuche euch alle fakten zu liefern die ich habe:


    Step 1: Ich änderte die sudoers wie folgt:



    Step 2: Erstellen der PHP datei zum test



    Step 3: Python Skript


    Python
    #!/usr/bin/env python
    from time import sleep
    import pifacedigitalio as p
    p.init()
    while(True):
    for value in range (0,2):
    for board in range (0,3):
    for pin in range (0,8):
    p.digital_write(pin,value,board)
    sleep(0.02)


    Wenn ich jetzt auf den Button "Anschalten" klicke passiert garnichts... wo ist mein fehler ? Ich bedanke mich im vorraus bei allen helfenden Köpfen !
    [hr]


    Ziemlich dumm von mir hatte im php code vergessen dem Button die ID zu vergeben ! Peinlich !

    Edited once, last by foxrage ().

  • Du fragst $_GET ab aber setzt dies nirgends ab. Wenn du schon copy&paste machst dann bitte auch vollständig :fies: Im ersten Beitrag steht der Code den du verwenden willst entscheidend anders.


    FAQ --> Nützliche Links / Linksammlung --> Befehle über PHP mit root Rechten ausführen (sudo webscript)

  • Hallo Leute,
    ich bin noch relativ neu in diesem Forum.


    Ich habe versucht meine Pythonscripte über PHP/HTML zu starten.
    Allerdings will es nicht fruchten.


    Hier mal meine Scripte, inklusive dem HTML-Script und Sudoers.


    index.html



    LED_an.py


    LED_aus.py

    Code
    #!/usr/bin/env python
    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(13, GPIO.OUT)
    GPIO.output(13, False)


    sudoers


    Die Scripte habe ich mit

    Code
    sudo chmod 755 LED_an.py


    bzw

    Code
    sudo chmod 755 /var/www/LED_an.py


    ausführbar gemacht.


    Aber die LED will nicht leuchten...


    Ich danke vorab.