Guten Abend,
bin gerade dabei meine Fhem Konfiguration von einem RPI auf einen Banana Pi umziehen zu lassen. Dabei bin ich auf ein Syntax Problem gestoßen: Ich möchte über ssh auf einem anderen Client (RPI) einen shell Befehl ausführen. Das klappt prinzipiell, habe es z.B. mit einem android debugging Befehl schon hinbekommen. Bei folgendem Befehl bekomme ich aber immer wieder Syntax Errors:
TV:on {{system("ssh 192.168.178.28 -p 22 -l pi 'echo "on 0" | sudo cec-client -s -d 1' ")}}
Ist aus der Def eines Notify kopiert. Der Befehl klappt, wenn ich ihn direkt übers Terminal absetze, wunderbar. Nur in Kombination mit dem system ("") scheint es Schwierigkeiten zu geben. Ich tippe auf die Anführungszeichen... Das Log liefert:
2016.11.07 22:21:11 1: PERL WARNING: Bareword found where operator expected at (eval 74) line 1, near ""ssh 192.168.178.28 -p 22 -l pi 'echo "on"
2016.11.07 22:21:11 3: eval: my $NAME='TV';my $EVTPART0='on';my $TYPE='dummy';my $EVENT='on';my $SELF='notify_TV_on';{{system("ssh 192.168.178.28 -p 22 -l pi 'echo "on 0" | sudo cec-client -s -d 1' ")}}
2016.11.07 22:21:11 1: PERL WARNING: Number found where operator expected at (eval 74) line 1, near "on 0"
2016.11.07 22:21:11 3: eval: my $NAME='TV';my $EVTPART0='on';my $TYPE='dummy';my $EVENT='on';my $SELF='notify_TV_on';{{system("ssh 192.168.178.28 -p 22 -l pi 'echo "on 0" | sudo cec-client -s -d 1' ")}}
2016.11.07 22:21:11 1: PERL WARNING: String found where operator expected at (eval 74) line 1, near "0" | sudo cec-client -s -d 1' ""
2016.11.07 22:21:11 3: eval: my $NAME='TV';my $EVTPART0='on';my $TYPE='dummy';my $EVENT='on';my $SELF='notify_TV_on';{{system("ssh 192.168.178.28 -p 22 -l pi 'echo "on 0" | sudo cec-client -s -d 1' ")}}
2016.11.07 22:21:11 3: notify_TV_on return value: syntax error at (eval 74) line 1, near ""ssh 192.168.178.28 -p 22 -l pi 'echo "on "
Freue mich über jeden Denkanstoß, da ich aus dem Log nicht wirklich schlau werde. Habe schon alle Anführungszeichen Kombinationen durch glaube ich und sogar schon auf dem Mac und auf dem Win PC versucht einzutippen, falls sich da irgendwo der Fehlerteufel eingeschlichen hat...
Zitatsystem("ssh 192.168.178.28 -p 22 -l pi 'echo "on 0" | sudo cec-client -s -d 1' ")
auf den ersten Blick würde ich den system so machen.
system("ssh 192.168.178.28 -p 22 -l pi 'echo \"on 0\" | sudo cec-client -s -d 1' ")
Ich würde einige Klammern weglassen und die ' schützen/maskieren.
Laut commandref (http://fhem.de/commandref_DE.html#command)gehen " innerhalb von " " (FHEM Befehlstypen)
Laut Perlwiki (https://wiki.selfhtml.org/wiki/Perl/Zeichenketten) müssen ' geschützt werden -> \'
TV:on {"ssh 192.168.178.28 -p 22 -l pi \'echo "on 0" | sudo cec-client -s -d 1\' "}
oder eventuell geht es auch so
TV:on "ssh 192.168.178.28 -p 22 -l pi \'echo "on 0" | sudo cec-client -s -d 1\' "
Aber das ist blanke Theorie ;)
Gruß Otto
Otto,
kann man direkt Shell im Notify ausfüren?
Also eine {} Ebene ist sicher überflüssig. Perl meckert aber wegen dem ersten String, der ist "ssh 192.168.178.28 -p 22 -l pi 'echo "
und er weiss nichts mit on 0 anzufangen und alles was dann noch kommt. Das ' stört eigentlich nicht. Deshalt soltest du die " im String escapen mit \"
Zitat von: sumsum am 07 November 2016, 22:51:41
Otto,
kann man direkt Shell im Notify ausfüren?
geht, definitiv ;) also z.B. "aplay /opt/fhem/cache/templates/doorbell-1.wav" geht im notify in der Kommandozeile von FHEMWEB usw...
Ich habe mir das deshalb eingeprägt, weil es mal einen Beitrag von Rudi gab, wo er das mit ziemlicher Emotion erklärt hat 8)
Bei dem anderen kannst Du Recht haben, ich habe nur im Perlsyntax geblättert. Wie gesagt: ist bei mir Theorie und ich habe derzeit keine Lust mehr es zu testen ;)
Gruß Otto
Hallo, entschuldigt bitte die späte Rückmeldung. Die netten Herren von Uni*****ia haben mal wieder die Kabel zersägt oder so. Naja egal. Das Maskieren der Anführungszeichen war die Lösung :) Danke!
Da wäre jetzt noch interessant welche. Also wie sieht es final aus? Für die Nachwelt.. :D
Gruß Otto
Oh entschuldigt bitte. Frei nach dem Motto: Besser spät als nie:
TV:on { { system("ssh 192.168.178.28 -p 22 -l pi 'echo \"on 0\" | sudo cec-client -s -d 1' ")}}
Damit hat es geklappt :) Danke nochmal und schöne Festtage.