FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: manne44 am 16 November 2023, 18:05:37

Titel: [Gelöst] Shell Script in Perl ausführen
Beitrag von: manne44 am 16 November 2023, 18:05:37
Hallo,
ich möchte einen G-Tag auslesen. Dazu habe ich ein kleines Script geschrieben:
#!/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 on
else
        echo off
fi
rm $filename

Auf einem RPI-Zero habe ich auch Fhem installiert und würde mit FHEM2FHEM den gefundenen Wert an den RPI4 mit Fhem senden, damit es dort ausgewertet werden kann. Das funktioniert. Es ist das Einzige, das auf dem Zero gemacht wird, deshalb sind sleeps usw. völlig unbedeutend.

Was nicht funktioniert und da kann ich machen was ich will - wahrscheinlich das Falsche -, es geht nicht.
Wenn ich
user@zero:/opt/fhem# ./lescan.sh 7C:2F:80:99:C8:69
auf dem RPI-Zero aufrufe, dann wird on oder off ausgegeben. Einwandfrei.
Wenn ich aber eine Perl-Funktion mit dem gleichen Inhalt aufrufe:
sub
get_gTagState($) {
        my ($nr) = @_;
        my $result = "undef";
# $result = system "./opt/fhem/lescan.sh $nr";
# $result = system "bash ./lescan.sh $nr";
my $x = "7C:2F:80:99:C8:69";
$result = system("/opt/fhem/lescan.sh $x");
return ($result);
}
Egal wie ich das Script in Perl aufrufe,  ob mit "system" oder "qx", immer kommt die Meldung:
set scan parameters failed: Operation not permitted
Diese Meldung kommt wahrscheinlich aus dem "hcitool", aber warum beim Perl-Aufruf und nicht beim Terminal-Aufruf?
Das ist mir sehr schleierhaft. Vielleicht kann das jemand sagen. Vielen Dank.
Titel: Gelöst: Shell Script in Perl ausführen
Beitrag von: manne44 am 16 November 2023, 18:19:48
Alles geklärt. Im Terminal wurde das Shell-Script unter "root" ausgeführt, aus Perl muß das mit sudo erfolgen. Dort will Perl noch ein Passwort haben, aber das werde ich noch klären können.
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: Wernieman am 16 November 2023, 19:09:07
Sudo ohne Passwort für den Befehl und User fhem einrichten.

Bitte nicht komplett!
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: manne44 am 16 November 2023, 20:07:58
Wenn ich mit visudo ändere
# User privilege specification
root    ALL=(ALL:ALL) ALL
fhem    ALL=(ALL:ALL) NOPASSWD: ALL
funktionierts, aber wenn ich den direkten Befehl freischalten will,
fhem    ALL=(ALL:ALL) NOPASSWD: /bin/hcitool
dann funktioniert es nicht. Also bleibe ich erst einmal bei "ALL", was wohl nicht so im Sinne der Rechte-Erfinder sein wird.
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: Otto123 am 16 November 2023, 21:37:04
Ich hatte das hier mal niedergeschrieben https://heinz-otto.blogspot.com/2017/08/raspberry-ausschalten-mit-fhem.html
Ja nachdem was Du mit sudo aufrufst, muss genau das in der sudoers drin stehen ;)

Ich meine dies hier
$result = system("/opt/fhem/lescan.sh $x");gibt Dir nichts verwertbares zurück. system() gibt unter FHEM eigentlich immer nur -1 zurück. Siehe auch https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html
Wenn Du also z.B. qx(sudo /opt/fhem/lescan.sh $x) aufrufen willst, dann muss mMn
fhem    ALL=(ALL:ALL) NOPASSWD: /opt/fhem/lescan.sh *in die sudoers Zeile.

Ich habe es mit bash Script direkt aufgerufen noch nicht probiert...

BTW: ich glaube für die Aufgabe gibt es schon "rotierende Räder" ;)
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: Wernieman am 17 November 2023, 09:08:02
Wobei man eigentlich Scripte an besten nicht in die Sudoer packt, sondern direkte Befehle.

Ich weiß jetzt nicht, warum das mit /bin/hcitool nicht passt. Eventuell ist der Pfad nicht richtig? Im sudo wird das Programm ohne Pfad aufgerufen?

FHEM komplett zu root zu machen halte ich als die schlechteste Möglichkeit, vorher hätte ich versucht, Fehlersuche zu betreiben ....
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: Otto123 am 17 November 2023, 09:26:05
Zitat von: Wernieman am 17 November 2023, 09:08:02Wobei man eigentlich Scripte an besten nicht in die Sudoer packt, sondern direkte Befehle.
Ich weiß ja nicht wie er es versucht hat. Im Script sehe ich zwei Aufrufe mit hcitool und pkill. pkill an sich braucht kein sudo, aber wenn ich damit einen prozess abwürgen will der mit sudo gestartet wurde schon. ;)

Und nur mit /bin/hcitool in der sudoers funktioniert es sowieso nicht, denn es wird ja mit Parameter aufgerufen.
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: manne44 am 17 November 2023, 10:53:25
Vielen Dank erst einmal für Eure Bemühungen, aber das mit den Rechten ist doch nicht so einfach und setzt schon spezielles Wissen voraus. Und mein aktuelles Problem ist sicher ein Rechte-Problem. Vor einigen Jahren hatte ich genau das gleiche gemacht und diesen G-Tag ausgelesen, das hatte funktioniert, aber ich weiß nicht mehr wie ich das gemacht hatte, vieleicht mit einem C-Programm? Keine Ahnung.

Folgende Versuche habe ich unternommen:
fhem    ALL=(ALL:ALL) NOPASSWD: /bin/hcitool,/opt/fhem/lescan  --> qx() läuft nicht
fhem    ALL=(ALL:ALL) NOPASSWD: /bin/hcitool *  --> visudo erzeugt Fehler, Stern will er nicht
fhem    ALL=(ALL:ALL) NOPASSWD: /bin/hcitool,/opt/fhem/lescan 7C:2F:80:99:C8:69 --> visudo erzeugt Fehler, Bluetooth-Add will er nicht
fhem    ALL=(ALL:ALL) NOPASSWD: ALL --> läuft

Der Aufruf unter user pi im Terminal ohne besondere Rechte mit
sudo bash ./lescan.sh 7C:2F:80:99:C8:69
funktioniert einwandfrei und liefert echo on/off. Offenbar ist der Perl-Aufruf ein Problem, aber wie dem beizukommen ist, keine Ahnung.

Der Aufruf
my $scan_result = qx(sudo bash /opt/fhem/lescan.sh 7C:2F:80:99:C8:69);
funktioniert aus der Perl-Funktion nur mit allen Rechten für Fhem und gibt als Ergebnis
$scan_result = on oder off
zurück. Offenbar ist qx() das Problem, aber wie ich das freigeben kann, das weiß ich nicht.

Selbstverständlich ist es keine gute Idee Fhem zu root zu machen, aber im Moment fällt mir nichts anderes ein. Und Fehlersuche ist bei Problemen immer angebracht, aber wie soll das hier passieren?
Ich habe vieles über diese ominösen Rechte gelesen, auch das von Otto und nicht nur dieses, ist immer eine Fundgrube, aber ohne zählbares Ergebnis.


Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: MadMax-FHEM am 17 November 2023, 11:01:14
Zitat von: manne44 am 17 November 2023, 10:53:25Der Aufruf unter user pi im Terminal ohne besondere Rechte mit
Naja, der User pi hat ja erst mal generell sudo ohne Passwort für alles...
...also keine "besonderen Rechte" stimmt ja so nicht ;)

Also sofern man ganz normal "installiert" hat, zu finden in /etc/sudoers.d/010_pi-nopasswd

EDIT: ich habe meine Einträge für fhem daher auch in /etc/sudoers.d/010_fhem-nopasswd stehen 8)

Gruß, Joachim
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: manne44 am 17 November 2023, 13:27:33
@ MadMax-FHEM

Vielen Dank für die Aufklärung über die Rechte des Users pi und wo sie gefunden werden.
Bei mir steht in /etc/sudoers.d/010_pi-nopasswd:
user ALL=(ALL) NOPASSWD: ALL
Bei bookworm gibt es keinen User pi mehr.

Aber ist es nicht egal wohin man das schreibt? Es scheint mir nur "der Ordnung halber" oder hat es einen tieferen Sinn?
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: Otto123 am 17 November 2023, 13:36:04
Zitatqx(sudo bash /opt/fhem/lescan.sh 7C:2F:80:99:C8:69);
So ist es aber wieder anders, ich meine damit gehört
/bin/bash *in die sudoers. ;)
Aber vielleicht ist das generell beim Aufruf von Scripten so, egal ob man bash davor schreibt oder nicht. Das ausführbare Script lädt ja als erstes was im Shebang steht und übergibt das Script. (Meine Vorstellung, habe es wie gesagt nicht probiert)

Welche Datei man editiert ist im Endeffekt egal. Die extra Datei in /etc/sudoers.d finde ich persönlich bequem und hilft Ordnung zu halten. Im Zweifel löscht man einfach die Datei und / oder macht sie neu.
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: manne44 am 17 November 2023, 15:27:40
Vielen Dank Otto, ich habe nun die sudoers-Datei wieder in den Ursprungszustand gebracht und in /etc/sudoers.d die Datei 010__fhem-nopasswd mit folgendem Inhalt erzeugt:
fhem ALL=(ALL) NOPASSWD: /bin/bash *Muss ich da noch einen systemctl restart xy machen?

Ebenso auch den user fhem in die sudo-gruppe aufgenommen:
sudo usermod -aG sudo fhemIch hoffe mal, dass ich da nicht wieder alle Türen geöffnet habe, aber es funktioniert ganz famos. In der Perl-Funktion wird qx() ohne Fehler aufgerufen.

Vielen Dank an alle, die mir hier geholfen haben.
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: Otto123 am 17 November 2023, 15:37:13
Zitat von: manne44 am 17 November 2023, 15:27:40Muss ich da noch einen systemctl restart xy machen?
Nein, das wirkt sofort beim nächsten mal.

Zitat von: manne44 am 17 November 2023, 15:27:40Ebenso auch den user fhem in die sudo-gruppe aufgenommen:
Das wirkt erst nach der nächsten Anmeldung von fhem...

Zitat von: manne44 am 17 November 2023, 15:27:40Ich hoffe mal, dass ich da nicht wieder alle Türen geöffnet habe
Naja damit darf fhem über eine bash alles machen :)

Du könntest noch weiter einschränken:
fhem ALL=(ALL) NOPASSWD: /bin/bash /opt/fhem/lescan.sh *Und die Datei /opt/fhem/lescan.sh für fhem nur lesbar machen.
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: Wernieman am 17 November 2023, 17:29:34
1. Der User muß nicht in der Gruppe sudo sein, damit er sudo Rechte bekommt. Wie im aktuellen Pi die Gruppe sudo verheiratet ist, weiß ich nicht .. hier eigentlich unnötig.
2. Warum tragt Ihr immer bash in sudo ein?

Am besten ein Shell-Script für root (oder sudo) immer komplett schreibgeschützt für alle ... root (oder sudo) darf dann eigentlich trotzdem schreiben bearbeiten. Für Starten ist nur xr notwendig, also lesen und ausführen.
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: Otto123 am 17 November 2023, 17:48:39
Zitat von: Wernieman am 17 November 2023, 17:29:342. Warum tragt Ihr immer bash in sudo ein?
Nicht "immer" - aber er führt im Script zwei Befehle an mehreren Stellen aus, die sudo brauchen. Entweder man ändert an drei Stellen das script, oder startet das Script mit sudo - ODER? Dein Vorschlag?
Titel: Aw: [Gelöst] Shell Script in Perl ausführen
Beitrag von: Wernieman am 18 November 2023, 14:31:11
Nein ich meinte in der sudo ein "bash" eintragen .. ansonsten stimme ich Dir zu, wenn man die Berechtigungen des Scriptes, wer darf schreiben, richtig einstellt