PHP Extension root Rechte

  • Hallo Allerseits,


    Ich habe zur aktuellen wiringPi Version (2) eine PHP Extension gebildet und in PHP eingefügt. Mit einer PHP Klasse kann ich nun auf alle Funktionen von WiringPi zugreifen bzw. diese ausführen, wenn da nicht die Hürde mit den Rechten wäre:

    PHP
    <?php
    ...
    wp2::wiringPiSetup();
    ...


    wird leider mit einer Fehlermeldung im error.log quittiert:

    Quote


    wiringPiSetup: Must be root. (Did you forget sudo?)


    was mus ich tun, damit die Extension (wiringpi2.so) mit den nötigen Rechten ausgeführt wird?:helpnew:


    Gruß
    Gunter


  • was mus ich tun, damit die Extension (wiringpi2.so) mit den nötigen Rechten ausgeführt wird?:helpnew:


    Gruß
    Gunter


    Hallo Gunter,


    ich denke, Dein Problem liegt nicht darin, dass Deine .so entsprechend ausgeführt wird sondern das ist ein allgemeines Problem bei script-Sprachen verschärft durch die Kombination mit dem Webserver.


    Das wurde schon mal in diesem Thread ausführlich durchgespielt ...
    Ich möchte Dich aber bitten, den Thread aufmerksam bis zum Ende zu verfolgen, da manche -auf den ersten Blick funktionierende Lösungsansätze - sich im Nachherein als Sicherheitslücke entpuppten.


    Ich hoffe, damit kommst Du etwas weiter,


    Grüsse aus dem "dampfigen" SO-Bayern,
    -ds-

  • Ich hab das bei mir so gelöst:


    In /etc/sudoers ans Ende eine Zeile eingefügt um ein bash Script auszuführen:

    Code
    www-data ALL=NOPASSWD:/var/sudoscript.sh


    In dem Script /var/sudoscript.sh wiederum kann ich dann nach belieben, ohne wieder jemals irgend etwas an der /etc/sudores ändern zu müssen, Befehle einbauen die als root ausgeführt werden, die ich dann wiederum über PHP ausführen kann:


    bash Script:




    In PHP:

    Code
    exec('sudo /var/sudoscript.sh 4cron restart',$output,$return_var);
    
    
    exec('sudo /var/sudoscript.sh rebootsys',$output,$return_var);



    Weiss nicht inwiefern das Sicher ist - ich fand das jedenfals sicherer als www-data direkt das Recht auf alle möglichen Befehle zu geben (ich kann die Befehle beliebig benennen wie "rebootsys" was dann eben "reboot" ausführt, aber ein Fremder kennt den Befehl nicht)

  • Hmmm... Dein Lösungsvorschlag hörte sich für mich so an, als wäre es genau das, was ich suchte... aber es funktioniert bislang nicht, was mache ich falsch?


    Habe PHP-Datei "phptest.php" folgenden Inhalts in /var/www abgelegt:



    (Ist da ein Syntax-Error drin???)


    Habe die PHP-Seite der Gruppe www-data hinzugefügt:


    Code
    chown www-data:www-data /var/www/phptest.php



    In /var habe ich testscript.sh abgelegt, das bei Direktaufruf als Root (sh /var/testscript.sh) auch funktioniert (öffnet Schublade des DVD-Players):


    Bash
    #!/bin/bash
    
    
    eject /dev/sr0
    
    
    exit 0


    testscript.sh habe ich wie in Deiner Anleitung in /etc/sudoers eingefügt:


    Code
    www-data ALL = NOPASSWD: /var/testscript.sh


    Öhm, tja, und wenn ich "phptest.php" im Browser aufrufe, passiert einfach nix!


    Welche Rechtevergabe habe ich evtl. vergessen?
    Welche Syntax-, Denk- oder Schreibfehler habe ich evtl. gemacht?


    LG,
    Hasenbein

  • Ich bin ja nun nicht so der Server-Experte :shy: Habe Lighttpd drauf, in /var/log/lighttpd ist nur 1 Datei namens "error.log", und da drin stehen nur 3 Zeilen a la "Server gestartet, Server beendet etc."...


    EDIT: Übrigens läuft laut php.ini das PHP bei mir auch nicht im Safe-Mode, exec-Befehle sollten also eigentlich ausgeführt werden...

  • @ hasenbein,
    aber php hast du schon installiert?
    Zeigt dir:

    PHP
    <?php
    phpinfo();
    ?>



    irgendetwas an?


    Gunter

  • Yup, klar! PHP Version 5.4.4-14+deb7u3 ist drauf, und phpinfo-Seite wird bei Aufruf im Browser brav angezeigt.

  • Hallo Hasenfuss ... äh ... bein ;) ...


    gibts evtl. Hinweise in anderen Logs? Mr fällt da jetzt nur ein separater php-log oder syslog ein.


    Soviel ich weiss, kann man PHP auch von einer Kommandozeile aufrufen.
    Habe ich zwar noch nie gemacht, aber einige cron-jobs auf meinem RPi sind php-scripte.


    cu,
    -ds-

  • Hmmm... bin immer noch nicht weitergekommen.


    Habe den Raspi nochmal ganz neu aufgesetzt (auch wegen Audioproblemen) und jetzt Raspyfi drauf.


    Läuft alles prima so weit, phpinfo spuckt auch alles brav aus wie gehabt.


    Leider funktioniert die Scriptausführung nach wie vor nicht :wallbash:


    Hier mal die Dateiberechtigungen und Nutzer-/Gruppenzugehörigkeiten von "testscript.sh" und "phptest.php":


    [Blocked Image: http://i40.tinypic.com/jv2ixu.jpg]


    Sieht doch eigentlich alles so aus, wie's muss, oder?? :huh: :denker:


    P.S.: Dreamshader, das mit der Kommandozeile ist irrelevant für mich, da ich gerne über eine Weboberfläche Programme auf dem Raspi starten/steuern will.

  • Ahaaaa! Danke!


    Es wird eine Fehlermeldung ausgespuckt:


    Code
    sudo: /var/testscript.sh: command not found


    Und was nun? *doof anstell*


    Heißt das, sudo erkennt /var/testscript.sh nicht als gültiges Kommando?


    Oder ist das, was in testscript.sh steht, ungültig??


  • Sieht so aus, als ob das /var/testscript.sh nicht gefunden wird, würde ich sagen.
    Hast Du den script mit chmod ausführbar gemacht?


    cu,
    -ds-

  • Notfalls einfach die Scripte manuell ausführen um zu prüfen ob es "eigentlich" gehen müsste...


    also das bash script ausführen: /var/testscript.sh
    (ohne vorrangestelltes bash! also nicht bash /var/testscript.sh , da man dann nicht weiss ob das script ansich ausführbar ist)


    php Dateien über die Konsole ausführen geht so: php -f /var/www/phptest.php

  • Mal noch ne Frage (wenn's ok ist)!


    Das Aufrufen lokaler Programme über PHP, welches ein Bashscript über die beschriebene Methode aufruft, funktioniert so weit prima. Habe schon einiges damit realisiert.


    Aaaber: Nun brauche ich von einem lokalen Programm einen Rückgabewert (Bashscript soll also nicht nur Fehlercode 0 oder 1 zurückgeben, sondern einen Wert, der durch ein von ihm aufgerufenen Programm ausgespuckt wurde)!


    Da wird's offenbar kompliziert. Bis jetzt hatte ich die Idee, das Bashscript in eine Named Pipe schreiben zu lassen; das Auslesen der Pipe von PHP aus krieg ich bis jetzt aber noch nicht hin.


    Seh ich möglicherweise den Wald vor lauter Bäumen nicht? Gibt es noch andere Möglichkeiten?


  • Aaaber: Nun brauche ich von einem lokalen Programm einen Rückgabewert (Bashscript soll also nicht nur Fehlercode 0 oder 1 zurückgeben, sondern einen Wert, der durch ein von ihm aufgerufenen Programm ausgespuckt wurde)!


    In Post#3 hatte ich das bereits mit angegeben:

    Code
    exec('sudo /var/sudoscript.sh 4cron restart',$output,$return_var);


    Dort wird die Rückgabe (falls vorhanden) von dem Script in ein Array $output geschrieben und falls es einen Fehlercode gab wird der in $return_var hinterlegt


    Ein Einfaches Beispiel:


    Die Ausgabe wäre dann:


    Führt man stattdessen einen Befehl aus den es nicht gibt wird in $return_var generell 127 eingetragen:


    Ausgabe:

    Code
    Error: 127


    Und auch noch eine Demonstration für einen anderen exit Wert:
    /var/www/test.sh

    Bash
    #!/bin/bash
    echo dies ist ein test
    exit 2


    Über Konsole ausgeführt: bash /var/www/test.sh
    sieht man nur "dies ist ein test"


    Aber über PHP:


    Käme nur:

    Code
    Error: 2




    Beachte dafür auch: http://php.net/manual/de/function.exec.php


    Auf php.net gibt es zu jedem PHP Befehl eine sehr gute Beschreibung und auch Beispiele



    /EDIT: Querverweiss: http://www.forum-raspberrypi.d…it-php?pid=26804#pid26804