Python Skript wird normal gestartet, funktioniert aber nicht über php-Skript-Aufruf

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Hallo zusammen.


    einsetzen möchte ich das Python Skript send.py zum Schalten von Funk-Relais Modulen.


    mit dem Statement

    pip3 install rpi-rf

    wurde das RPI-Softwarepaket installiert



    Per SSH wird das Kommando

    pi@raspberrypi:~/webdir $ python3 ./send.py 7427331

    erfolgreich ausgeführt - und das Relais schaltet!

    (Der code 7427331 wurde mittels Skript recieve.py als CODE der angelernten Fernbedienung ermittelt)


    Per PHP-Skript (switchtest.php.txt) soll das selbe Kommando ausgeführt werden. siehe Funktion startrelais()

    Dabei wird aber immer nur die Meldung

    sh: 1: rpi: not found

    ausgegeben.

  • Ich bezweifele das jetzt einfach mal und sage das Problem ist die `run()`-Funktion. Denn *die* scheint ein Shell-Skript zu starten. Die Fehlermeldung kommt nämlich von einem Shell-Skript.

    „Eat the rich — the poor are full of preservatives.“ — Rebecca ”Becky” Connor, The Connors

  • Meine Alarmglocken gehen runter wegen dem "sudo" in der shell_exec(.....).

    Vielleicht mal mit /usr/bin/sudo probieren mit pfad, obwohl da wäre vermutlich auch eine Fehlermeldung gekommen weil.

    Sudo hat kein Passwort :)

  • det_lev_da ``sudo`` muss nicht zwingend ein Passwort erwarten. Man kann das in ``/etc/sudoers`` konfigurieren wer da was unter welchem Benutzer mit und ohne Password ausführen darf.

    „Eat the rich — the poor are full of preservatives.“ — Rebecca ”Becky” Connor, The Connors

  • Die vielen "sudo"s gehören jedenfalls raus.

    Als User pi sollte das Script /home/pi/webdir/python/send.py auch ohne sudo funktionieren, wenn es ihm gehört.


    Mit < setfacl -m u:www-data:rx /home/pi/webdir/python/send.py >

    erlaubst Du dem User www-data das File send.py zu lesen und auszuführen, alsob er der Eigentümer (User pi) ist.


    Mit < setfacl -x u:www-data:rx /home/pi/webdir/python/send.py > wird www-data wieder aus der File Access Control List gelöscht, falls es nicht funktioniert.


    < man acl >, < man setfacl >


    Das setzt auch vorraus, dass im home-Verzeichnis des Users pi, oder im Webverzeichnis /var/www noch nicht mit Internethoaxes wie chmod777, oder Rootrechten herumgehackt wurde.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Hallo zusammen,


    danke für die Informationen.

    @__blackjack__: Nein es geht wirklich nur um die Funktion startrelais() !

    run() funktioniert bereits ein halbes Jahr und ist ein Aufruf einer exe (send.exe) für Funkschalter der Fa. brennenstuhl


    @RTFM: setfacl ist meinem Pi unbekannt / auch man setfacl kann nicht gestartet werden.

    HIer mein Versuch der Eingabe:

    pi@raspberrypi:~/webdir $ man setfacl

    Kein Handbucheintrag für setfacl vorhanden


    @__blackjack__: Habe nun in die sudoers-Datei die Zusätze

    www-data ALL=NOPASSWD:/home/pi/433Utils/RPi_utils/send

    www-data ALL=NOPASSWD:/home/pi/webdir/python/send.py

    eingepflegt.

    Die sudo-Angaben habe ich aus Funktion run() entfernt und sie läuft noch mit Brennenstuhl-Empfängern! ;)


    Nun wird durch den _exec-Aufruf in der Funktion startrelais() folgender Text ausgegeben:

    Traceback (most recent call last):

    File "/home/pi/webdir/python/send.py", line 6, in

    from rpi_rf import RFDevice

      ModuleNotFoundError: No module named 'rpi_rf'


    (Die Zeile 6 des Python skriptes send.py enthält

    from rpi_rf import RFDevice)

     

    Warum wird die Zeile bei Eingabe an dem LX-Terminal erfolgreich bearbeitet und per Aufruf durch ein PHP-Skript nicht ?

    Ich vermute, das es an Python -Zusatzpaketen in bestimmten Verzeichnissen liegt.

    Wie sage ich dem www-data User, das die Suche der Python-Pakete bestimmte Quellverzeichnisse betrifft.

    (Habe im Python-Skript noch keine Möglichkeit gefunden, anzugeben das rpi_rf aus dem Verzeichnis

    /home/pi/.local/lib/python3.7/site-packages/rpi_rf/ 

    bezogen werden kann.)




    #####

    Nicht ärgern - Nur wundern wenn es klappt:conf:

  • Du musst das entweder systemweit installieren oder in einem virtualenv. Der Benutzer www-data wird nicht so einfach auf nur für den Benutzer pi installierte Python-Packages zugreifen können, und das sollte man auch gar nicht erst versuchen irgendwie hinzubiegen.

    „Eat the rich — the poor are full of preservatives.“ — Rebecca ”Becky” Connor, The Connors

    • Official Post

    www-data in Verbindung mit sudo ist und bleibt falsch, egal in welcher Form man das versucht hinzubiegen. In dem Fall ist es besser www-data zur Gruppe gpio hinzuzufügen. Über sudo von einer Website aus ein Programm mit einem anderen Benutzer auszuführen ist das beste Beispiel, warum sudo dort nichts verloren hat. :fies:


    Btw. Das Modul für Python Systemweit installieren und gut, aber das wurde ja auch schon erwähnt.

  • Ich benutzte nie sudo sondern wie vom TE erwähnt die /etc/sudoers, mit Python gibts da Feinheiten :) sorry


    Nur das ich nicht setfacl benutzen würde sondern


    chown www-data:www-data /home/pi/...../script.py


    Müsste auch funktionieren.

  • chown www-data:www-data /home/pi/...../script.py


    Müsste auch funktionieren.

    Solange "www-data" nicht schreibend auf das Ausgabe-Device zugreifen kann, bleibt ihm die Ausführung des Schaltbefehles verwehrt.

    Schreibrechte auf Geräte (Devices) werden üblicherweise über die Gruppenverwaltung erteilt.

    < ls -al /dev > zeigt die schreibberechtigten Gruppen der dort aufgelisteten Geräten an.

    Auch wenn das Script auf

    rwxrwxrwx www-data:www-data /home/pi/...../script.py

    abgeändert wird, wird nur der User pi das erfolgreich ausführen können, solange nur er Gruppenmitglied für die Schreibrechte am Ausgabegerät ist.


    Dass das ACK ACL Paket bei sparsamen Distributionen, oder Spezialimages nicht vorinstalliert ist, ist schon möglich. Es wurde aber früher zumindest für das Automount, zur Verzeichniserstellung des Mountpoints, gebraucht.



    Servus !

    RTFM = Read The Factory Manual, oder so