shell_exec weigert sich in PHP

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo liebe Raspberry Pi Community,

    folgenden raspistill-Befehl (für die Aufnahme eines Fotos über die RPI-Kamera) möchte ich gerne über eine Datei foto.php aufrufen:

    <?PHP
    shell_exec("/usr/bin/raspistill -q 100 -br 50 -ex auto -co 20 -sa 20 -mm average -sh 10 -w 380 -h 200 -n -o /var/www/imageembed.jpg");
    $filename = "imageembed.jpg";
    $handle = fopen($filename, "rb");
    $contents = fread($handle, filesize($filename));
    fclose($handle);
    echo $contents;
    ?>

    Die foto.php wird wiederum von einer anderen php-Datei - test.php - aufgerufen. Es handelt sich um eine einfache Internetseite und der Aufruf erfolgt über <img src="foto.php">.

    Sobald man die Internetseite öffnet, wird also das Foto geschossen und auf der Seite test.php angezeigt.
    So zumindest auf meine Raspberry Pi Nr. 1 (apache 2, php5).

    Ich habe die beiden Dateien auf meinen Raspberry Pi Nr. 2 kopiert - ebenfalls ins var/www-Verzeichnis. Ebenfalls apache 2, php5. Leider wird dort das shell_exec offenbar nicht ausgeführt, denn das Foto wird nicht gemacht. Das apache-Log erzählt mir darüber nichts.

    PHP-Scripte an sich werden ausgeführt. Ich habe in der test.php eines direkt integriert, das mit den Wert des Temperaturfühlers als Text ausgibt. Klappt wunderbar. Also muss es an der shell_exec liegen, denke ich zumindest.

    Nun bin ich ein absoluter Berechtigungs-Noob. Ich nehme aber mal an, es liegt an irgendwelchen Berechtigungen.
    Wie kann ich RPI 1 mit RPI 2 vergleichen? Bzw. was könnte es noch sein, das die Funktionalität verhindert?

    1000 Dank im Voraus und viele Grüße
    Muhackl

  • Hallo Muhackl,

    was mir auf die Schnelle dazu einfällt:
    Du rufst "/usr/bin/raspistill" auf, normalerweise ist "raspistill" aber im Verzeichnis "/opt/vc/bin" (falls kein symbolischer link in /usr/bin/ gesetzt wurde).

    Gruß, mmi

  • Hi,
    danke für den Tipp. Aber ich habe in Sachen raspistill zwei Dinge unternommen:
    1.) Den Pfad weggelassen, weil im Prinzip kann man es ja von überall aus aufrufen.
    2.) Im angegebenen Verzeichnis nachgesehen. raspistill findet sich dort.

    Dennoch werde ich den von Dir angegebenen Pfad ausprobieren.
    Grüße
    Muhackl

  • Hallo,
    gute Frage - genau hier setzt meine vollständige Rechteverwaltungsunkenntnis an.
    Wie prüfe ich das?
    Genügt ein ls -l im Verzeichnis von raspistill und wenn ich den besagten Nutzer neben "raspistill" finde, passt es?

    Grüße
    Muhackl


  • 1.) Den Pfad weggelassen, weil im Prinzip kann man es ja von überall aus aufrufen.

    Du solltest lieber vollständie Pfade nutzen!
    Denn das was du nun meinst "weil im Prinzip kann man es ja von überall aus aufrufen" trifft nur zu wenn sich der Pfad im $PATH des Benutzers befindet


    Wenn apache2 etwas nicht ausführen kann wird dazu eigentlich eine Fehlermeldung ausgegeben/geschrieben, die wiederum dir exakt verrät was schief läuft.. um die anzuzeigen gibt es 2 Möglichkeiten:

    • Ins entsprechende Logfile von apache2 nachgucken: /var/log/apache2/error.log
    • Im php File oben folgendes festlegen:

      Code
      error_reporting(E_ALL);
      ini_set('track_errors',1);
      ini_set('display_errors',1);

    Normalerweise befindet sich raspistill nur in /opt/vc/bin/ , auf deinem #1 PI wird höchst warscheinlich eine Verknüpfung (symlink) in /usr/bin/ sein - was hierfür aber keine Rolle spielt, du musst die Rechte der ursprungsdatei prüfen und das machst du mit folgendem Befehl:

    Code
    ls -la /opt/vc/bin/

    Um nun zu verstehen ob "www-data" die nötigen Rechte hat kannst du dir folgendes durchlesen: http://wiki.ubuntuusers.de/Rechte

    Dabei spielen aber nicht nur die Rechte der Datei eine Rolle sondern auch die Verzeichnisse die zu dieser Datei führen - in diesem Fall also sowohl /opt/ als auch die untergeordneten vc/bin/

  • Hallo und danke für die vielen Tipps.

    Ich habe jetzt überall die vollständigen Pfade benutzt. Ohne Erfolg.

    Das Apache error.log gibt nichts aus, nachdem ich die .php-Datei über den Browser aufrufe. Keine Einträge zu der Uhrzeit, zu der ich die Datei aufgerufen habe.

    Den genannten Code (error_reporting usw.) habe ich in die php-Datei eingehängt - wo finde ich jetzt die Ausgabe?

    Die Rechte für die Ursprungsdatei von raspistill habe ich mit dem genannten Befehl geprüft. Sie lauten: -rwxr-xr-x 1 www-data root 45737 Sep 4 20:12 raspistill

    Ich habe dem Ordner /var/www mit chown -R www-data /var/www versucht, irgendwelche Rechte zu geben. Leider ohne Erfolg.

    Was könnte es noch sein bzw. was könnte ich noch versuchen? Was sollte ich mit dem Raspi vergleichen, auf dem es funktionierte?

  • Wenn du dich über FTP als root anmeldest kannst du darüber auch chmod ausführen - sofern das FTP Programm was taugt ;)


    muhackl: beim Ausführen von chown kommt keine Bestätigung, nur bei Fehlern eine Fehlermeldung
    Aber das wird an deiner Sache nichts ändern - es muss also was im apache2 logfile stehen wenn er das nicht ausführen kann, ansonsten würde ich einfach mal einen anderen php Befehl nutzen der dir auch mehr Auskunft geben kann wie zum Beispiel exec();
    [code=php]exec("/usr/bin/raspistill -q 100 -br 50 -ex auto -co 20 -sa 20 -mm average -sh 10 -w 380 -h 200 -n -o /var/www/imageembed.jpg", $output, $error);

    if ((isset($output) AND !empty($output)) OR (isset($error) AND !empty($error))) {
    if (!empty($error)) { echo "ERROR: $error<br/>"; }
    foreach ($output AS $oline) { echo "$oline<br/>"; }
    }
    [/php]


  • Ich habe dem Ordner /var/www mit chown -R www-data /var/www versucht, irgendwelche Rechte zu geben. Leider ohne Erfolg.

    Ja, versuch es mal so :


    Code
    sudo chown -R www-data /var/www

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Das ist eine äusserst unsaubere Lösung - wie man aber in dem Post auch lesen kann, achtet er da nicht wirklich drauf...

    Auf 777 zu stellen ist eigentlich quatsch - das erlaubt allen: Lesen, Schreiben, Ausführen ... Wozu aber Ausführen? Also würde wenns sein muss auch 666 reichen

    Damit ein PHP Script, welches vom Benutzer www-data aufgerufen wird, in einem Verzeichnis schreiben kann muss er dafür selbstverständlich die passenden Rechte haben... Wenn das Verzeichnis aber dem "root" Benutzer gehört, geht das natürlich nicht - wer möchte schon das jemand fremdes sein Verzeichnis vollmüllt :D
    Das selbe gilt für /dev/vchiq , fügt man den Benutzer der auf die Cam zugreifen möchte der Gruppe video hinzu hat dieser auch Zugriff auf diese Datei - und das sogar dauerhaft also auch noch nach einem Reboot:

    Code
    usermod -G video -a www-data

Jetzt mitmachen!

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