Bash-Script via PHP aufrufen

Hallo zusammen

Ich stehe etwas auf dem Schlauch und könnte die Hilfe eines Linux-Cracks / PHP Programmierers gebrauchen.

Ich möchte folgendes tun:

  • Via IPSymcon eine PHP-Seite auf einem Raspberry pi aufrufen
  • Der entsprechende PHP-script ruft seinerseits auf dem lokalen Raspberry pi einen Bash-script auf, welcher einen Stromzähler via USB-Infrarot-Dongle ausliest
  • Der Output des Bash-scriptes wird dem PHP-script mitgeteilt und zurückgegeben

Was ich bereits gemacht habe:

  • Der Bash-script funktioniert einwandfrei, wenn ich ihn auf dem Raspberry aufrufe
  • Der PHP-script lässt sich problemlos aufrufen

Wo ich noch Probleme habe:

  • Wenn ich den PHP-script aufrufe erhalte ich nicht den vollständigen Output des Bash-scriptes zurück

Output des Bash-scriptes bei lokalem Aufruf (auf dem Raspberry pi)


root@Stromzaehler:/home/pi# /bin/bash /home/pi/zaehler_auslesen1_web.sh
Initialisierung Sensor ... done
Auslesen Zaehler ...................... done
2017-07-19;07:45:54;175223;013533.539;008587.599;000000.000;000000.000;235;001.09;235;001.23;235;001.30;

PHP-script welcher auf dem Raspberry pi aufgerufen wird


<?php
$output = shell_exec('/bin/bash /home/pi/zaehler_auslesen1_web.sh');
echo "<pre>$output</pre>";
?>

Ob ich jetzt „system“, „exec“ oder eben „shell_exec“ verwenden macht keinen Unterschied im Verhalten, einzig die Formatierung der Darstellung ist etwas anders.

Im Browser sehe ich dann folgende Daten:


Initialisierung Sensor ... done
Auslesen Zaehler  done
2017-07-19;07:47:54;;;;;;;;;;;;

Offensichtlich wird der Zähler gar nicht ausgelesen, da keine Daten zwischen den ; vorhanden sind. Zudem erhalte ich den Output im Browser nach ca. 2 Sekunden, während das Ausführen des Bash-scriptes ca. 20 Sekunden benötigt.

Hat jemand eine Idee, warum ich ein unterschiedliches Verhalten im Aufruf des Bash-scriptes (lokal oder via PHP-script habe) ?
Mein Ansatz waren die unterschiedlichen Benutzer, welche den Script aufrufen. Mit „root“ geht es verständlicherweise, aber auch mit dem „pi“ Benutzer. Mit „www-data“ kann ich es allerdings nicht testen, da der Befehl „su www-data“ ein „This account is currently not available.“ zurückliefert.

Besten Dank.

Gruss Letraz

Was macht denn das Bash Skript genau? Lässt sich das nicht ohne den Umweg über das Bash Skript direkt aus IP-Symcon lösen?

Hallo Fonzo

Der Bash-Script ruft die Daten aus den beiden Stromzählern ab. Das kann ich nicht direkt aus IP-Symcon aus machen, denn die USB-Infrarot Leseköpfe sind nicht am IP-Symcon-Rechner angeschlossen. Die Stromzähler und der IP-Symcon-Rechner befinden sich in unterschiedlichen Räumen.

Am Bash-Script liegt mein Problem ja nicht, denn der Script funktioniert ja, wenn ich ihn lokal am Raspberry pi aufrufe.

Gruss Letraz

Etwas Pause und nachdenken hilft manchmal ungemein um ein Problem zu lösen …

Der PHP-script ruft den Bash-script mit dem User www-data auf und dieser Benutzer hatte keine Schreib-Leserechte auf den USB-Infrarot-Dongle. Ein simples chmod auf die entsprechenden USB-Dongle hat geholfen und der PHP-Code funktioniert nun:


chmod o+rw /dev/ttyUSB0

Der PHP-code liefert das gewünschte Ergebnis:


Initialisierung Sensor ... done
Auslesen Zaehler ...................... done
2017-07-19;16:55:41;175223;013537.800;008587.599;000000.000;000000.000;237;001.08;236;001.24;236;001.27;

Nun kann ich die beiden einleitenden Zeilen weglassen und IP-Symcon kann die Zähler abfragen und entsprechend auswerten. Coole Sache (auch wenn es draussen gerade über 30°C ist)