FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: SSSleep am 07 November 2015, 09:54:38

Titel: System()-Aufruf aus Fhem
Beitrag von: SSSleep am 07 November 2015, 09:54:38
Hallo,

ich versuche einen GPIO des Raspberrys zu schalten. Ich habe das skript gemäß wiki erstellt und kann als Benutzer "pi" von der Konsole aus schalten. Aus Fhem bzw. der Fhem Kommandozeile scheitern die System-Aufrufe leider noch. Der Rückgabewert ist immer -1.

Um es bezüglich der Rechte erst einmal zu vereinfachen, habe ich versucht einfach das Datum

{system("date" &)}

abzufragen. Hier bekomme ich auch nur den Wert -1 zurück.

Muss ich noch etwas einstellen, um einen Systembefehl absetzen zu können?

Vielen Dank
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: rapster am 07 November 2015, 10:49:45
exec

executes a command and never returns. It's like a return statement in a function.

If the command is not found exec returns false. It never returns true, because if the command is found it never returns at all. There is also no point in returning STDOUT, STDERR or exit status of the command. You can find documentation about it in perlfunc, because it is a function.

system

executes a command and your Perl script is continued after the command has finished.

The return value is the exit status of the command. You can find documentation about it in perlfunc.

backticks

like system executes a command and your perl script is continued after the command has finished.

In contrary to system the return value is STDOUT of the command. qx// is equivalent to backticks. You can find documentation about it in perlop, because unlike system and execit is an operator.

____

Was du willst ist also z.B.
{ `date` }
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: SSSleep am 07 November 2015, 11:11:34
Ah okay, danke.

Dann liegt mein Problem evtl wohl doch bei den Rechten? Eigentlich will ich ja ein

{system("sudo /usr/sbin/fhem-gpio.sh 17 1 &")}

absetzen. 
Ein ls -l auf der Kommandozeile gibt folgendes aus:
pi@raspberrypi /usr/sbin $ ls -l |grep fhem
-rwxr-xr-x 1 root root    255 Nov  6 20:37 fhem-gpio.sh



Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: P.A.Trick am 07 November 2015, 11:13:05
Hast du den fhem User in die sudoers eingetragen?
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: SSSleep am 07 November 2015, 13:00:48
ja...
pi@raspberrypi /usr/sbin $ sudo adduser fhem sudo
Der Benutzer »fhem« ist bereits ein Mitglied der Gruppe »sudo«.
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: SSSleep am 07 November 2015, 16:29:42
Gerade habe ich diese Meldung im Logfile gefunden:

sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben
2015.11.07 08:06:56 3: Heizung_on return value: -1
2015.11.07 08:06:56 3: act_on_Heizung2 return value: -1


Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: Hans Franz am 07 November 2015, 16:36:30
http://forum.fhem.de/index.php/topic,36120.msg313007.html#msg313007 (http://forum.fhem.de/index.php/topic,36120.msg313007.html#msg313007)

Gruß
Hans
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: SSSleep am 07 November 2015, 17:01:36
...habe es geändert, aber geholfen hat es nicht :(

pi@raspberrypi ~ $ less /etc/passwd | grep fhem
fhem:x:999:20::/opt/fhem:/bin/bash


Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: Hans Franz am 07 November 2015, 19:09:01
Hallo,
fhem neu anmelden. Vlt. einfach reboot.

Gruß
Hans
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: SSSleep am 07 November 2015, 19:26:03
..habe schon neu gebootet...sogar mehrmals!

Das bash hat mir insofern doch geholfen, dass ich jetzt auf der Konsole zum benutzer fhem wechseln kann. Also habe ich den Befehl mal als fhem abgesetzt. Es kommt folgende Meldung in Verbindung mit einer Passwortabfrage:

fhem@raspberrypi:/home/pi$ sudo /usr/sbin/fhem-gpio.sh 17 0

Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die
Regeln erklärt hat.  Normalerweise läuft es auf drei Regeln hinaus:

    #1) Resprektieren Sie die Privatsphäre anderer.
    #2) Denken Sie nach bevor Sie tippen.
    #3) Mit großer Macht kommt große Verantwortung.

[sudo] password for fhem:
fhem@raspberrypi:/home/pi$ gpio readall


..gebe ich das Passwort ein, wird auch den Pin geschaltet
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: SSSleep am 07 November 2015, 20:38:21
..ich habe es. Ich hatte gestern beim probieren dem Benutzer fhem ein Passwort vergeben. Das Passwort braucht man wohl auch um auf der Konsole zum Benutzer fhem zu wechseln. Nachdem ich jetzt das Passwort gelöscht habe,
pi@raspberrypi ~ $ sudo passwd --delete fhem
passwd: Passwortablauf-Informationen geändert.


kann ich jetzt auch aus fhem heraus schalten.

Vielen Dank für die Hilfe
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: Carsten K. am 12 Januar 2022, 09:14:02
Ein alter Thread aber das richtige Thema...

Folgender geplanter Ablauf:
Im Einzeltest funktioniert die Textausgabe.
Ein weiterer Befehl nach der Textausgabe wird abgearbeitet.

sub testSpeak()
{
  my $mesg = "es klingelt";
  my $fName = "/opt/fhem/sounds/doorbell_10.mp3";
  `castnow "$fName" --address 192.168.178.102 --quiet`;
  fhem "msg audio $mesg"; # keine Ausgabe
  fhem "msg push $mesg"; # Wird ausgegeben
}

Ich vermute, dass das Ausgabegerät (Mi Smartspeaker) noch irgendwie blockiert ist - aber das ist geraten...
Ein "sleep 5 ;" for fhem "msg audio $mesg"; hat nichts gebracht.

Vielleicht hat jemand eine Idee?

Grüße,
Carsten
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: Otto123 am 12 Januar 2022, 09:47:16
Hallo Carsten,

es ist immer besser einen neuen Thread mit seinem Problem aufzumachen!

Das hier `castnow "$fName" --address 192.168.178.102 --quiet` ist nicht system() sondern qx(). https://perldoc.perl.org/perlop#Quote-Like-Operators
Der Aufruf blockiert FHEM solange bis der Aufruf zu Ende ist. system() könnte man so aufrufen, dass es nicht blockiert, qx() blockiert immer.
Ein FHEM Aufruf "castnow \"$fName\" --address 192.168.178.102 --quiet" würde nicht blockieren. https://fhem.de/commandref_DE.html#command

Hat aber sicher nichts mit deinem eigentlichen Problem zu tun.

Gruß Otto
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: Carsten K. am 12 Januar 2022, 10:22:35
Zitat von: Otto123 am 12 Januar 2022, 09:47:16
Hallo Carsten,

es ist immer besser einen neuen Thread mit seinem Problem aufzumachen!
Hallo Otto,
ich hatte gehofft, dass Du dich meldest, da ich den ausführlichen Artikel in Deinem Technik-Blog gelesen hatte ;)
Dann werde ich den Beitrag noch mal neu einstellen => https://forum.fhem.de/index.php/topic,125377.0.html

Vielen Dank soweit,
Carsten
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: ReneR1986 am 30 Januar 2022, 20:13:12
Hallo zusammen,

funktioniert System() auch, wenn FHEM im Docker Container läuft?
Ich wollte ebenfalls über SSH ohne Passwort mit Public/Private Key einen Befehl auf einem Remote Raspberry absetzen.

Die Erzeugung der Keys etc. müsste dann im Container vorgenommen werden, oder?
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: Otto123 am 30 Januar 2022, 21:28:02
Ja und Ja - wobei es egal ist wo die Keys erzeugt werden, sie müssen vom user fhem im Container verwendbar sein.
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: ReneR1986 am 30 Januar 2022, 21:41:14
Ok, dann teste ich das mal.
Danke
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: Otto123 am 30 Januar 2022, 22:14:10
vielleicht hilft Dir meine Notiz (https://heinz-otto.blogspot.com/2020/09/ssh-mit-public-key.html).
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: P.A.Trick am 31 Januar 2022, 07:02:37
Zitat von: ReneR1986 am 30 Januar 2022, 20:13:12
Hallo zusammen,

funktioniert System() auch, wenn FHEM im Docker Container läuft?
Ich wollte ebenfalls über SSH ohne Passwort mit Public/Private Key einen Befehl auf einem Remote Raspberry absetzen.

Die Erzeugung der Keys etc. müsste dann im Container vorgenommen werden, oder?

Du kannst auch SSH vom Host verwenden und dich dann auf den Docker Container verbinden. Dann sparst du dir das ssh Geraffel im Container.
Beispiel findest du hier: https://github.com/stormmurdoc/fhemdocker/blob/master/fcmd.sh
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: ReneR1986 am 31 Januar 2022, 08:27:12
Hallo zusammen,

ich konnte es mit SSH zum laufen bringen.
Danke für deine Notiz Otto.

Im Docker Container war schon alles vorhanden.
Folgendes musste ich noch machen:

#Remote Rechner
Benutzer anlegen:
sudo useradd -m -g users -s /bin/bash <Neuer Benutzer>
sudo passwd <Neuer Benutzer>

#Lokaler Rechner (Im Docker Container)
In den Container springen:
sudo docker exec -it  <containerID> /bin/bash

Public Key des FHEM users auf das Zielsystem kopieren (hier kommt zunächst noch eine Passwortabfrage):
ssh-copy-id -i /opt/fhem/.ssh/id_rsa.pub <Neuer Benutzer>@<IP des Remote Rechners>

Testen der passwortlosen SSH Verbindung (immer noch im Docker Container):
ssh '<Neuer Benutzer>@<IP des Remote Rechners>'
Jetzt kam bei mir wieder die Passwortabfrage. Das lag aber daran, dass ich im Container als root angemeldet war.
Wenn man mit su fhem zum fhem user wechselt und den Befehl erneut ausführt, geht es ohne Passwort.

Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: Otto123 am 31 Januar 2022, 09:27:12
Zitat von: P.A.Trick am 31 Januar 2022, 07:02:37
Du kannst auch SSH vom Host verwenden und dich dann auf den Docker Container verbinden. Dann sparst du dir das ssh Geraffel im Container.
Beispiel findest du hier:
Interessante Info, aber ReneR1986 ging es doch um die andere Richtung? Also nicht rein per ssh in den Container, sondern raus aus dem Container :)
Titel: Antw:System()-Aufruf aus Fhem
Beitrag von: ReneR1986 am 31 Januar 2022, 11:06:50
Ja genau,

per SSH raus aus dem Container in dem FHEM läuft.