Hi,
ich stehe "mal wieder" total auf dem Schlauch. Auch die Suche hat mir nicht geholfen:
Ich würde gerne ein Shell Script aus der FHEM Kommandozeile starten. Später dann auch via Dummy, allerdings will es schon in der FHEM Kommandozeile nicht klappen.
Hier meine verwendete Syntax:
{system "sudo sh /opt/fhem/hdmi2.sh"}
Allerdings kommt im WebIf dann als Rückgabe immer nur -1 und das Shellscript wird nicht ausgeführt.
Im Log steht nichts, allerdings kann ich das Shellscript in der Shell selbst mit dem Benutzer unter dem auch FHEM läuft einwandfrei starten. ???
Mein Shell Script sendet prinzipiell nur HEX Werte an meinen Sony Beamer via Netzwerk:
Zitatprintf "\x02\x0ASONY\x00\x17\x2b\x02\x00\x00" | nc 192.168.178.39 53484
Kann mir jemand nen Tipp geben? k.A. obs am Shellscript liegt oder irgendwo ein Escapecharacter fehlt oder sowas.
Ich würde auch ein anderes Modul nehmen was HEX werte an IP/Ports senden kann, bin bisher aber nicht fündig geworden.
Danke und LG
EDIT:nach vielem hin und her lag es dann tatsächlich daran, dass in den Scripts kein "shebang" angegeben war. siehe auch: https://wiki.ubuntuusers.de/Shebang_f%C3%BCr_Shellskripte/ (https://wiki.ubuntuusers.de/Shebang_f%C3%BCr_Shellskripte/)
Fügt man diese an den Anfang des Scripts hinzu funktioniert genau wie erwartet!
Also ausführen des Scripts in FHEM Kommandozeile ganz simpel via:
"/opt/fhem/hdmi1.sh"
Und das Script sieht dann so aus:
#!/bin/bash
echo -n -e "\x02\x0ASONY\x00\x17\x2b\x02\x00\x00" | nc 192.168.178.39 53484 #HDMI1
Hi,
system() liefert nur -1 als Quittung - das ist normal so. Die Standard Ausgabe des Scripts landet im LogFile.
Wozu nimmst Du sudo?
Funktioniert das in der FHEM Kommandzeile?
"sh /opt/fhem/hdmi2.sh"
die " " gehören dazu!
Siehe https://fhem.de/commandref_DE.html#command
Gruß Otto
Hi Otto,
danke für deine Hilfe!
ZitatWozu nimmst Du sudo?
Das war auch nur ein Versuch weil ich dachte es habe etwas mit "Berechtigungen" zu tun. Fehlanzeige.
Wenn ich das so ausführe wie in deinem Beispiel steht im Log nur folgendes:
\x0\x
Sieht für mich so aus als würde da was abgeschnitten. Vielleicht doch Escapecharacter einfügen?
So ähnlich wie in deinem Blogpost beschrieben? https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html
ZitatIm folgenden Beispiel muss der Name der Variable im Shellscript auch geschützt werden.
Im Zweifelsfall hilft nur probieren!
Danke und Grüße
Christian
Hallo Christian,
kann ich nicht nachvollziehen :(
Ich habe genau Deinen Befehl in eine Scriptdatei gepackt und lausche auf einem anderen Host mit nc -l
raspib Datei tt.sh:
printf "\x02\x0ASONY\x00\x17\x2b\x02\x00\x00"|nc raspib3plus 4000
raspib3plus in der Konsole
nc -l 4000
In der Kommandozeile von FHEM von raspib
"sh /home/pi/tt.sh"
Ausgabe in der Konsole von raspib3plus
\x02\x0ASONY\x00\x17\x2b\x02\x00\x00
im Log landet da nichts.
Ok in meinem Beispiel wird erstmal die Verbindung nicht geschlossen. Wenn ich auf dem raspib3plus mit "willi & ctrl+c" schließe, landet "willi" im Log von raspib.
Würde in deinem Fall bedeuten: Dein receiver quittiert mit \x0\x ???
Gruß Otto
Hi,
danke dir fürs Testen!
Ich verstehe es auch nicht. Zumal es via Shell direkt einwandfrei klappt!
Je nachdem ob ich "" oder '' verwende steht auch mal mehr und mal weniger im Log:
02\xAS
\x0\x
Deswegen war meine Vermutung es liegt irgendwie am Escaping... :(
ich verstehe nicht, wieso der Befehl in der LINUX Shell so einwandfrei funktioniert und in der FHEM Kommandozeile nicht.
Power ON:
echo -n -e "\x02\x0ASONY\x00\x17\x2F\x02\x00\x00" | nc 192.168.178.39 53484
Zitat von: suchmich1983 am 30 August 2021, 12:37:51
ich verstehe nicht, wieso der Befehl in der LINUX Shell so einwandfrei funktioniert und in der FHEM Kommandozeile nicht.
Power ON:
echo -n -e "\x02\x0ASONY\x00\x17\x2F\x02\x00\x00" | nc 192.168.178.39 53484
Wie hast du das denn in FHEMWeb eingegeben?
"echo -n -e \"\x02\x0ASONY\x00\x17\x2F\x02\x00\x00\" | nc 192.168.178.39 53484"
bzw.:
"echo -n -e '\x02\x0ASONY\x00\x17\x2F\x02\x00\x00' | nc 192.168.178.39 53484"
Oder meinst du im Vergleich zum Script? Weil das weicht ja von deinem Script ab...
EDIT: wobei ich jetzt nicht weiß, ob "Pipes" in FHEMWeb "gehen"...
Gruß, Joachim
Zitat von: MadMax-FHEM am 30 August 2021, 12:40:55
EDIT: wobei ich jetzt nicht weiß, ob "Pipes" in FHEMWeb "gehen"...
Die gehen nicht!
Deswegen ja, der Aufruf des Shellscripts muss eigentlich gehen, der printf oder echo Befehl mit Pipe direkt in der FHEM Kommandozeile geht nicht.
Die FHEM Kommandozeile ist eben keine Linux Shell Konsole :)
Zitat von: Otto123 am 30 August 2021, 12:47:03
Die gehen nicht!
Deswegen ja, der Aufruf des Shellscripts muss eigentlich gehen, der printf oder echo Befehl mit Pipe direkt in der FHEM Kommandozeile geht nicht.
Die FHEM Kommandozeile ist eben keine Linux Shell Konsole :)
Danke.
Ich wusste doch da "war was" ;)
Gruß, Joachim
also ich will das nicht Oberlehrerhaft behaupten, aber bei mir ging es bisher "so einfach" nicht. Ich habe aber eventuell auch noch nicht alles in diesem System verstanden. Rudi meinte seinerzeit mal: es sollte eigentlich gehen, er hatte keine Erklärung dafür.
Deswegen in meinem Kopf: einfache shell Befehle direkt absetzen, sobald die Umleitung sein muss, oder die Sache ein bisschen länger wird, viele Strings eine Rolle spielen -> Script machen und das aufrufen.
Also was ich schon mitbekommen hab: "Doppel-Pipe" geht wohl eher nicht...
Ansonsten: ich probiere auch lang nicht alles aus..
...und bin sowieso eher ein "Freund" von myUtil-Subs oder (Shell-)Scripten... :)
Gruß, Joachim
Hi,
schon mal gut zu wissen das Pipen nicht geht.
Trotzdem funktioniert in der Shell:
/opt/fhem/hdmi1.sh
In der FHEM Kommandozeile funktioniert aber weder:
"/opt/fhem/hdmi1.sh"
noch
"sh /opt/fhem/hdmi1.sh"
ich schnalle nur einfach nicht wieso! Dachte immer es würde nur das Shellscript aufgerufen?
Dank Euch!
Ich schicke die Befehle jetzt mal an eine andere IP mit Shellzugriff damit ich auch sehe was dort ankommt. (Danke Otto für den Tipp)!
Mein Shellscript:
echo -n -e "\x02\x0ASONY\x00\x17\x2b\x02\x00\x00" | nc 192.168.178.21 53484 #HDMI1
Am Empfänger kommt dann das an:
SONY,
Lasse ich im Shellscript "-e" weg, dann wird es sauber ausgegeben der Beamer reagiert nur trotzdem nicht.
\x02\x0ASONY\x00\x17\x2c\x02\x00\x00
Zitat von: Otto123 am 30 August 2021, 13:13:11
also ich will das nicht Oberlehrerhaft behaupten, aber bei mir ging es bisher "so einfach" nicht. Ich habe aber evntuell auch noch nicht alle sin diesem System verstanden. Rudi meinte seinerzeit mal: es sollte eigentlich gehen, er hatte keine Erklärung dafür.
Deswegen in meinem Kopf: einfache shell Befehle direkt absetzen, sobald die Umleitung sein muss, oder die Sache ein bisschen länger wird, viele Strings eine Rolle spielen -> Script machen und das aufrufen.
deswegen hatte ich mir ja shellscripte gemacht, geht ja leider auch nicht.
naja, ich würde sagen Du machst irgendwas verkehrt. Ich kann Dir mit dem Beamer nicht helfen.
echo mit und ohne -e ist ja ein gewaltiger Unterschied auch im Vergleich zu printf.
Also lass doch den Beamer außen vor und probiere nur den Syntax, ich denke wir reden irgendwie grundlegend aneinander vorbei.
/opt/fhem/hdmi1.sh
funktioniert ja nur mit ordentlichem shebang (habe ich in deinem Script nicht gesehen) und Script ausführbar gemacht (chmod -x)
Kannst Du mein Beispiel von oben mit nc als Empfänger nachvollziehen?
Gruß Otto
ja, ausführbar gemacht hatte ich es mit:
chmod +x SHELLSCRIPTNAME
Nen Shebang hatte ich nicht drin stimmt, und siehe da schon gehts! Sorry, ich muss gestehen ich bin echt ne Lusche in Sachen Linux. Meine Welt ist Windows und in PowerShell brauch man sowas nicht.
Sorry, da hätte ich auch mal selber drauf kommen können!
Lieben Dank Euch. Ich schreibe nachher noch ne kurzes HowTo wie es nun geklappt hat. Vielleicht es für andere Sony Beamer Besitzer auch noch interessant!
Grüße
Christian
Das würde dann bedeuten das der shell Aufruf (sh) bei Dir in der FHEM Umgebung nicht gefunden wird. Hatte ich noch nicht, aber ja: es empfiehlt sich generell im Zweifelsfall komplette Pfade zu verwenden.
/bin/sh /path/to/scriptname
Was gibt Dir denn dieser Ausdruck in der FHEM Kommandozeile zurück?
{qx(printenv PATH)}
Zitat von: Otto123 am 30 August 2021, 12:47:03
Die gehen nicht!
Deswegen ja, der Aufruf des Shellscripts muss eigentlich gehen, der printf oder echo Befehl mit Pipe direkt in der FHEM Kommandozeile geht nicht.
Die FHEM Kommandozeile ist eben keine Linux Shell Konsole :)
Hmm, scheinen wohl doch zu gehen?
Siehe: https://forum.fhem.de/index.php/topic,17201.msg1172529.html#msg1172529
Wobei ich "sowas" ja (weiterhin) auslagere... 8)
Gruß, Joachim
ZitatWas gibt Dir denn dieser Ausdruck in der FHEM Kommandozeile zurück?
{qx(printenv PATH)}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Viele Grüße
Christian
Zitat von: MadMax-FHEM am 31 August 2021, 10:14:26
Hmm, scheinen wohl doch zu gehen?
Hallo Joachim,
ich habe nicht gesagt, dass es in qx() oder system() (perl) nicht geht. Es geht direkt in der FHEM Kommandozeile nicht:
"echo 'willi' > test.txt"
willi landet im Log und es entsteht keine test.txt Datei.
Gruß Otto
@christian
Da ist der Suchpfad aber vorhanden. Da wundert mich warum die Variante:
"sh scriptname.sh"
nicht funktioniert haben soll. Ist mir ein Rätsel.
Grüß dich Otto,
ich tippe es hat funktioniert, allerdings fehlte ja doch immer noch der shebang?
Vom Blickpunkt geht / geht nicht - sind diese beiden Vorgehensweisen alternativ:
scriptname (shebang + Datei ausführbar)
sh scriptname (ohne oder mit shebang + Datei nur lesbar)
Zitat von: Otto123 am 31 August 2021, 14:44:55
ich habe nicht gesagt, dass es in qx() oder system() (perl) nicht geht. Es geht direkt in der FHEM Kommandozeile nicht:
"echo 'willi' > test.txt"
Hallo Otto,
jaein, wenn Du es klammerst, geht es doch. Warum das so ist, weiss sicher Rudi.
"(echo willi > test.txt)"
Zitatwilli landet im Log und es entsteht keine test.txt Datei.
Eine leere test.txt Datei wurde bei mir auch ohne Klammern angelegt; willi fand ich im Log.
Gruss Helmut
nur zur vollständigkeit halber hab ich hier mein HowTo hinterlassen. War unter anderem der Grund für diesen Thread hier: https://forum.fhem.de/index.php/topic,122741.0.html