Shell Script mit IPS_EXECUTE starten und Rückgabe in IP-Symcon Variable stellen

Hallo zusammen,

ich versuche derzeit ein auf dem Raspi erstelltes Shell Script zu starten. Der Rückgabewert soll in IP-Symcon in eine Variable gestellt werden und von dort ausgelesen werden können.

Hier das Shell Script:


#!/bin/bash
filename=/tmp/bluetooth_devices.$$
hcitool lescan > $filename & sleep 10
pkill --signal SIGINT hcitool
sleep 1
searchresult=$(grep -c $1 $filename)

if [ $searchresult -gt 0 ]; then
        echo 1

else
        echo 0
fi
rm $filename


Auf dem Raspi funktioniert der Aufruf einwandfrei mittels folgendem Befehl:

sudo bash lescan.sh 7C:2F:80:C4:6A:8D

Ich übergebe die MAC Adresse eines Beacon an das Script und dieses liefert eine „1“ zurück, wenn das Teil gefunden wird und eine „0“, wenn es nicht da ist.

Mit folgendem PHP Skript versuche ich das Shell Script aus IP-Symcon heraus zu starten:


<?
    // Ausführung eines Linux-Shell-Scripts mittels "IPS_Execute"
    
    $result = IPS_EXECUTE("/var/lib/symcon/scripts/lescan.sh","7C:2F:80:C4:6A:8D", true, false);


    if ($result == 0) {
        print "Der Befehl wurde erfolgreich ausgeführt.";
        print "Der Befehl gab den Wert \"".$result."\" zurück.";
    } else {
        print "Der Befehl gab den Fehler \"".$result."\" zurück.";
    }
?>


Ich habe den EIndruck, dass das Shell Script nicht aufgerufen wird. Selbst wenn der Beacon in Reichweite ist, kommt folgendes Ergebnis:

Der Befehl wurde erfolgreich ausgeführt.Der Befehl gab den Wert „“ zurück.
. Auch der Bluetooth Stick im Raspi, der immer kurz aufleuchtet, wenn ich das Shell Skript auf dem Raspi starte, leuchtet nicht.

Ich habe somit 2 Fragen:

  1. Was ist in meinem PHP Skript noch zu ändern, damit der Aufruf des Shell Scripts funktionieren kann?
  2. Wie kann ich den Rückgabewert aus dem Shell Script (1, oder 0) in eine IP-Symcon Variable schieben, um diese Variable dann abzufragen?

Viele Grüße
Uwe

Dein Rückgabewert ist sehr wahrscheinlich ein String, du vergleichst aber mit Integer 0.

Versuche mal einfach „exec“ anstatt „IPS_Execute“.
Viele Grüße
Jürgen

Hi!

Hatte hier im Forum mal was bzgl Unterschied von „exec“ und „shell_exec“ geschrieben - danach kannst du mal suchen (kann ich am Handy grad schlecht) und dann hast du eine Lösung :slight_smile:

Viele Grüße,
Chris

Hallo zusammen,
Danke soweit für die Anregungen. Hat leider noch nicht funktioniert:

Bezüglich „shell_exec“ habe ich folgende Variante versucht:



$output = shell_exec('/var/lib/symcon/scripts/lescan.sh 7C:2F:80:C4:6A:8D');

echo "<pre>$output</pre>";


Ich habe nach wie vor den Eindruck, dass das Shell Script auf dem Raspi so nicht ausgeführt wird. Kann es eventuell sein, dass es ein Berechtigungsproblem ist und der User mit dem IP-Symcon versucht das Script auf dem Raspi zu starten keine Berechtigung dafür hat? Mit welchem User greift IP-Symcon eigentlich auf das Shell Script zu?

IPS läuft als root - also sicher kein Berechtigungsproblem :wink:

Gibt das Skript auch was aus, wenn du es über SSH als root ausführst? Was wenn du die Ausgabe in eine Datei schreiben lässt und die in IPS einliest? Manche Sachen klappen einfach nicht über exec…

Grüße,
Chris

OK, wenn ich per SSH als root auf dem Raspi arbeite läuft das Skript auch anstandslos. Der Aufruf und der Rückgabewert („1“) sieht dann so aus:

root@smarthome:~# bash /var/lib/symcon/scripts/lescan.sh 7C:2F:80:C4:6A:8D
1
root@smarthome:~#

Gerne versuche ich Deinen weiteren Vorschlag - Schreiben des Rückgabewertes des Skriptes in eine Datei und dann in IPS einlesen. Ich weiss nur noch nicht wie das geht…Google ist mein Freund…

Grüße, Uwe

Was spricht gegen exec? Bei mir funktioniert es.

Zu „exec“ fand ich folgende Erklärung:

exec ( string $command [, array &$output [, int &$return_var ]] ) : string

Kannst Du mir bitte helfen und an meinem Beispiel aufzeigen, wie ich mein Skript mit der Mac Adresse in PHP aufrufe?

Mir ist das leider nicht klar.

Der 3. Parameter bei IPS_Execute ist der für Warten. Ist dieser false, dann wird ein leerer String zurück gegeben. Was passiert, wenn Du da true einsetzt?

Grüße, Gerhard

Leider keine Änderung.

$result = exec('/var/lib/symcon/scripts/lescan.sh 7C:2F:80:C4:6A:8D');

Dankeschön für Deine Hilfe. Nachdem ich noch ein „bash“ ergänzt hatte, hat es funktioniert:

$result = exec('bash /var/lib/symcon/scripts/lescan.sh 7C:2F:80:C4:6A:8D');

$result enthält jetzt den gesuchten Rückgabewert.

Endlich :slight_smile: