NEWS
[gelöst] Javascript "exec" nach fix.sh nicht mehr möglich
-
Liebe Community,
ich führe folgendes Script aus um meinen TV und den NUC zu steuern:
on({ id: "javascript.0.scriptEnabled.TV.TV_ein_aus", change: 'any' }, function(obj) { var current_state = getState("javascript.0.scriptEnabled.TV.TV_ein_aus").val; //"An"-Status für Alexa generieren if (current_state === true) { //Starte den NUC mit WOL-Befehl exec('sudo etherwake -i eth0 XX:XX:XX:XX:XX:XX'); //Yamaha-Receiver über Szene 2 einschalten (startet gleichzeitig den TV via HDMI-CEC) setTimeout(function() { setState('yamaha-community.0.scene', 1); }, 8000); setTimeout(function() { //Setze Receiver Lautstärke auf -40 & Surround Modus auf Standard setState('yamaha-community.0.volume', -450); setState ('yamaha-community.0.surround', "Standard"); }, 17000); log("Geräte sind gestartet mit Status, " + current_state, "info"); } else { //NUC über Kodi Adapter herunterfahren setState('kodi.0.system.Shutdown', true); log("Geräte sind heruntergefahren mit Status, " + current_state, "info"); } });
Nachdem ich nodejs und npm aktualisiert habe, habe ich auch ein "curl -sL https://iobroker.net/fix.sh | bash -" ausgeführt.
Dies scheint mir die Berechtigungen so eingeschränkt zu haben, dass ich jetzt mit dem iobroker Benutzer keine ausreichenden Berechtigungen mehr habe den Etherwake auszuführen.//Starte den NUC mit WOL-Befehl exec('sudo etherwake -i eth0 XX:XX:XX:XX:XX:XX');
In der Java Script Instanz ist der Haken bei "Erlaube das Kommando exec" gesetzt.
Wo muss ich was berechtigen, dass es wieder funktioniert?Vielen Dank & Gruß
Modjo
-
@Modjo sagte in Javascript "exec" nach fix.sh nicht mehr möglich:
sudo etherwake
Das ist das Problem. Der Adapter läuft als der User
iobroker
, der aus Sicherheitsgründen nur bestimmte Befehle persudo
ausführen darf. Alles Weitere musst du explizit erlauben.
Das ist hier im Forum schon mehrfach diskutiert worden, z.B. hier: https://forum.iobroker.net/topic/28877/gelöst-exec-in-js-funktioniert-nicht-mehr -
@AlCalzone Vielen Dank für deine Antwort:
Das hatte ich bereits gemacht. Ich habe eine custom_iobroker datei unter /etc/sudoers.d angelegt und befüllt:
which etherwake /usr/sbin/etherwake
cat custom_iobroker iobroker ALL=(ALL) NOPASSWD: /usr/sbin/etherwake
Leider ohne Erfolg. Gibt es noch weitere Ideen?
über ssh mit root user: funktioniert
über iobroker in javascript: funktioniert nicht.Gruß
-
@Modjo Hast du auch ioBroker neu gestartet?
Ansonsten kannst du testen, ob das in der Konsole geht. Also- als iobroker "einloggen"
- prüfen, ob hier der Pfad der gleiche ist. Wenn nicht, besser den vollständigen Pfad im Skript nutzen
- testen, ob die sudoers-Regel greift
sudo -u iobroker -s /bin/bash which etherwake sudo etherwake
Wenn es so aussieht (Frage nach Passwort), greift sie nicht:
-
@AlCalzone
Scheint wohl leider nicht zu greifen. Hast du eine Idee, woran das liegen kann? Vorher dem fix.sh hat das ja auch mit der custom_iobroker funktioniert.Viele Grüße
Modjo -
ls -la /usr/sbin/etherwake
Und bitte Konsolentext auch als Text (in </> CodeTags) ins Forum, aus Screenshots kann man nicht kopieren. Und durchsuchbar sind die auch nicht.
-
Okay ich gelobe Besserung
Hier das outcome:
ls -la /usr/sbin/etherwake -rwxr-xr-x 1 root root 8188 Nov 13 2013 /usr/sbin/etherwake
VG Modjo
-
@Modjo
Setz da mal das setuid bit:sudo chmod u+s /usr/sbin/etherwake
Danach nochmal mit
ls -la /usr/sbin/etherwake
prüfen wie die Rechte stehen
-
@Thomas-Braun said in Javascript "exec" nach fix.sh nicht mehr möglich:
sudo chmod u+s /usr/sbin/etherwake
sudo chmod u+s /usr/sbin/etherwake ls -la /usr/sbin/etherwake -rwsr-xr-x 1 root root 8188 Nov 13 2013 /usr/sbin/etherwake
Sieht gleich aus
-
@Modjo sagte in Javascript "exec" nach fix.sh nicht mehr möglich:
Sieht gleich aus
bis auf das s um das es ging
-
Huch, stimmt. Geht aber leider immer noch nicht
-
probier doch mal:
exec('sudo etherwake -i eth0 XX:XX:XX:XX:XX:XX', function (error, result, stderr) { console.log(result); });
ob da was im log steht
-
Vielen Dank.
Also wenn das in der Konsole des Javascripts auftauchen soll, dann kommt da nix:
on({id: "javascript.0.scriptEnabled.TV.TV_ein_aus", change: 'any' }, function(obj) { var current_state = getState("javascript.0.scriptEnabled.TV.TV_ein_aus").val; //"An"-Status für Alexa generieren if (current_state === true) { //Starte den NUC mit WOL-Befehl //exec('sudo etherwake -i eth0 XX:XX:XX:XX:XX:XX'); exec('sudo etherwake -i eth0 XX:XX:XX:XX:XX:XX', function (error, result, stderr) { console.log(result); }); //Yamaha-Receiver über Szene 2 einschalten (startet gleichzeitig den TV via HDMI-CEC) setTimeout(function() { setState('yamaha-community.0.scene', 1); }, 8000); setTimeout(function() { //Setze Receiver Lautstärke auf -40 & Surround Modus auf Standard setState('yamaha-community.0.volume', -450); setState ('yamaha-community.0.surround', "Standard"); }, 17000); log("Geräte sind gestartet mit Status, " + current_state, "info"); } else { //NUC über Kodi Adapter herunterfahren setState('kodi.0.system.Shutdown', true); log("Geräte sind heruntergefahren mit Status, " + current_state, "info"); } });
11:17:03.282 info javascript.0 (1417) script.js.TV.TV_ein_aus: Geräte sind gestartet mit Status, true
11:17:03.311 info javascript.0 (1417) Stop script script.js.TV.TV_ein_aus
11:17:03.319 info javascript.0 (1417) Start javascript script.js.TV.TV_ein_aus
11:17:03.329 info javascript.0 (1417) script.js.TV.TV_ein_aus: registered 1 subscription and 0 schedules
11:17:03.333 info javascript.0 (1417) script.js.TV.TV_ein_aus:
11:17:03.335 info javascript.0 (1417) script.js.TV.TV_ein_aus: Geräte sind heruntergefahren mit Status, false
11:17:03.357 info javascript.0 (1417) script.js.TV.TV_ein_aus: Geräte sind gestartet mit Status, true
11:17:03.384 info javascript.0 (1417) script.js.TV.TV_ein_aus:VG Modjo
-
@Modjo Bevor du im Adapter testest, probiers auf der Konsole oben aus. Solange du als
iobroker
ein Passwort brauchst, wirds nicht im Adapter gehen. -
Noch ne blöde idee: Wo findet
root
denn etherwake?sudo su which etherwake
-
Vielen Dank für den Tipp.
der root user findet den am selben Pfad:sudo su which etherwake /usr/sbin/etherwake
VG Modjo
-
ich habe es auch mit wakeonlan versucht - da funktioniert es auch
exec('sudo etherwake -i eth0 1C:69:7A:xxxxxx -D', function (error, result, stderr) { console.log(result); }); exec('wakeonlan 94:C6:91:xxxxx', function (error, result, stderr) { console.log(result); });
die ausgabe:
wie @AlCalzone schon sagte:
bei mir funktioniert aber auch :sudo -u iobroker -s /bin/bash
was auch bei mir geht: dieser befehl im script
sudo -u root etherwake -D -i eth0 1C:69:7A:xxxxxx
-
@Modjo was du auch anwenden könntest:
in der javascript- instanz (setting):
und dann im script:
var wol = require('wake_on_lan'); wol.wake("00:1D:72:xxxxx");
-
@Modjo sagte in Javascript "exec" nach fix.sh nicht mehr möglich:
der root user findet den am selben Pfad
Dann versteh ich es nicht ganz. Deine Datei sah gut aus. Ggf. einfach mal die Kiste komplett neu starten?
-
@AlCalzone
Das habe ich bereits mehrfach gemacht. Ich habe die "custom_iobroker" Datei auch neu erstellt, hat alles nichts gebracht.
@liv-in-sky
Danke für deine Unterstützung. Über wakeonlan hat es auch nicht funktioniert und die Logs blieben leer. Über den node-wol wollte ich es nicht lösen, da es per etherwake bisher immer super funktioniert habeIch habe nun einfach die iobroker Datei selbst in /etc/sudoers.d erweitert, anstatt eine neue Datei zu erstellen:
iobroker@RPI3:/etc/sudoers.d$ sudo cat iobroker iobroker ALL=(ALL) ALL iobroker ALL=(ALL) NOPASSWD: /sbin/shutdown iobroker ALL=(ALL) NOPASSWD: /sbin/halt iobroker ALL=(ALL) NOPASSWD: /sbin/poweroff iobroker ALL=(ALL) NOPASSWD: /sbin/reboot iobroker ALL=(ALL) NOPASSWD: /bin/systemctl start iobroker ALL=(ALL) NOPASSWD: /bin/systemctl stop iobroker ALL=(ALL) NOPASSWD: /bin/mount iobroker ALL=(ALL) NOPASSWD: /bin/umount iobroker ALL=(ALL) NOPASSWD: /usr/bin/systemd-run iobroker ALL=(ALL) NOPASSWD: /usr/bin/apt-get iobroker ALL=(ALL) NOPASSWD: /usr/bin/apt iobroker ALL=(ALL) NOPASSWD: /usr/bin/dpkg iobroker ALL=(ALL) NOPASSWD: /usr/bin/make iobroker ALL=(ALL) NOPASSWD: /bin/ping iobroker ALL=(ALL) NOPASSWD: /sbin/setcap iobroker ALL=(ALL) NOPASSWD: /usr/bin/vcgencmd iobroker ALL=(ALL) NOPASSWD: /bin/cat iobroker ALL=(ALL) NOPASSWD: /bin/df iobroker ALL=(ALL) NOPASSWD: /sbin/ldconfig iobroker ALL=(ALL) NOPASSWD: /usr/sbin/etherwake ALL ALL=NOPASSWD: /bin/systemctl start iobroker ALL ALL=NOPASSWD: /bin/systemctl stop iobroker ALL ALL=NOPASSWD: /bin/systemctl restart iobroker ALL ALL=(iobroker) NOPASSWD: /usr/bin/node /opt/iobroker/node_modules/iobroker.js-controller/iobroker.js *
Nun funktioniert es endlich wieder. Ich muss aber dann wohl nach jedem fix Installer einmal die Datei neu anpassen.
Ich danke allen für die Hilfe und die Unterstützung bei der Problemlösung!
VG Modjo