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-


  • Hallo dreamshader,

    5 Sekunden bei Google haben den folgenden Link ergeben. Die Shebang gibt es also auch für PHP-Skripte und die Skripte lassen sich dann direkt ausführen.

    http://www.electrictoolbox.com/php-shebang/

    Gruß Georg

    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 "http://www.data ALL="ALL" NOPASSWD: ALL" die sudo-rechte für http://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

  • 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 !


    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 !

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

    Einmal editiert, zuletzt von foxrage (2. März 2015 um 19:08)

  • 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.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!