NEWS
Exec unter JavaScript führt Shell Script nicht aus
-
Hallo, ich würde das Thema erneut aufgreifen wollen. Und zwar versuche ich verzweifelt ein einfaches Skript
#!bin/bash mkdir testordner
mittels exec auszuführen:
function execScript(){ exec('sudo /home/iobroker/test.sh', function (error, stdout, stderr) { console.log('stdout: ' + stdout); console.log('stdout: ' + error); }); }
Als Antwort kommt immer "stdout: Error: Command failed: sudo /home/iobroker/test.sh Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die Regeln erklärt hat. Normalerweise..."
Das Skript liegt im Ordner /home/iobroker und ist mittels chown auf den user iobroker gesetzt. chmod+x wurde auch getan. Das Skript läuft über Shell mit Putty anstandslos.
Die Varianten mit ./ und sudo und bash habe ich probiert, erfolglos. Die Installation von iobroker ist ca. 4 Monate alt.
Danke euch!
-
@WurstDLX sagte in Exec unter JavaScript führt Shell Script nicht aus:
Die Installation von iobroker ist ca.4 Monate alt.
das ist mal ne geile Beschreibung.. da wissen wir direkt welche Version installiert ist :-=)
ok spass beiseite
hast du auch
ausserdem das sudo muss weg
-
Habe iobroker 4.0.9 und JS 4.5.1 installiert.
Das Skriptfunction execScript(){ exec('/home/iobroker/test.sh', function (error, stdout, stderr) { console.log('stdout: ' + stdout); console.log('stdout: ' + error); }); }
hatte ich natürlich bevor ich mit der Fehlersuche anfing. Das sudo und Varianten habe ich dann im Laufe erfolglos getestet. Ja der Exec Command ist erlaubt. Reboot und ls etc läuft ohne Probleme.
-
@WurstDLX Der Skript-Adapter läuft als User
iobroker
.iobroker
darf nur bestimmte Kommandos als sudo ausführen./home/iobroker/test.sh
gehört nicht dazu. Du kannst es aber manuell erlauben, indem du die/etc/sudoers.d/iobroker
bearbeitest oder (bessere) im selben Verzeichnis eine eigene Datei pflegst. Wie das geht wurde schon zuhauf hier im Forum beschrieben.Allerdings bezweifle ich, dass root-Rechte nötig sind (und vermutlich ist es sogar schädlich), um im Home-Verzeichnis von iobroker als dieser User einen Ordner anzulegen.
Kommt denn bei der Variante ohne sudo ein Fehler?stderr
hast du ja nicht ausgegeben. -
@AlCalzone sagte in Exec unter JavaScript führt Shell Script nicht aus:
/etc/sudoers.d/iobroker
bearbeitest oder (bessere) im selben Verzeichnis eine eigene Datei pflegst.? der fixer legt doch den user iobroker in sudoers an, falls nicht vorhanden ? und im seinem HOME ... hat der "user" iobroker doch normal alle rechte ... AUSSER das test.sh wurde
durch nen anderen user erstellt -
function execScript(){ exec("echo 'passwort'|sudo -S dmesg", function (error, stdout, stderr) { console.log('stdout: ' + stdout); console.log('stdout: ' + error); }); }
Mit sudo geht's auch.
-
@Wal klar ... da brauchste es sudo , dass der "user" iobroker ja hat .... biste ausserhalb vom iobroker home .... mit dmesg
-
Mach ein
chmod +x test.sh
dann geht es
-
@Wal .... thx! an das hab ich nicht gedacht .... dass es script ned ausgeführt werden darf g
-
@AlCalzone
Also von vorne: Ich habe natürlich ohne sudo das aufgerufen und dann kommt das was ich bereits im ersten Post geschrieben hatte:
stderr:"Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die Regeln erklärt hat. Normalerweise läuft es auf drei ..."
stdout:
error: "Error: Command failed: /home/iobroker/test.sh Wir gehen davon aus, dass der lokale Systemadministrator Ihnen..."Das Skript wurde natürlich als user pi angelegt und per
chown -R iobroker:iobroker test.sh
geändert.
chmod +x test.sh
habe ich bereits getan gehabt. Wie gesagt, in der Shell läuft das Skript normal wie erwartet. Es wurde ins Verzeichnis /home/iobroker getan und wird dennoch nicht von js ausgeführt, bzw mit der oben genannten Fehlermeldung.
Der Aufruf mit sudo war einer von vielen Tests die ich im Anschluss getan hatte -
@harrym sagte in Exec unter JavaScript führt Shell Script nicht aus:
der fixer legt doch den user iobroker in sudoers an
Nein, der legt die genannte Datei an, die definiert, welche Befehle iobroker per sudo passwordless ausführen darf.
Aus Sicherheitsgründen darf iobroker nur das nötigste per sudo ausführen.@Wal sagte in Exec unter JavaScript führt Shell Script nicht aus:
exec("echo 'passwort'|sudo -S dmesg"
Wie willst du das machen, wenn der User iobroker kein Passwort hat?
@WurstDLX sagte in Exec unter JavaScript führt Shell Script nicht aus:
in der Shell läuft das Skript normal wie erwartet.
In der Shell bist du sicherlich nicht als
iobroker
angemeldet oder?Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die Regeln erklärt hat. Normalerweise läuft es auf drei ...
Verwendest du
sudo
im Skript? Dann müssen dem User iobroker alle Kommandos mitsudo
passwordless erlaubt werden.Die Suche liefert z.B. folgenden Post:
https://forum.iobroker.net/post/356868 -
@WurstDLX sagte in Exec unter JavaScript führt Shell Script nicht aus:
mkdir testordner
Öhhhhhh - hast du mal nen absoluten Pfad probiert?
/home/iobroker/testordner
Ich bin gerade nicht sicher, in welchem Verzeichnis exec die Befehle ausführt.
-
@AlCalzone sagte in Exec unter JavaScript führt Shell Script nicht aus:
@Wal sagte in Exec unter JavaScript führt Shell Script nicht aus:
exec("echo 'passwort'|sudo -S dmesg"
Wie willst du das machen, wenn der User iobroker kein Passwort hat?
Stimmt du hast recht, bin jetzt von mir ausgegangen. Ich erstelle vor der Installation von ioBroker immer den User "iobroker".
Ich möchte keine anderen User auf meinem Server nur zur Administration. -
@AlCalzone
Ooh, vor lauter Testerei habe ich das sudo im Skript selbst vergessen :/.
Jetzt führt er es aus, nur ist der Fehler diesmal, beim mkdir, dass er keine Berechtigung hat den testordner anzulegen.@AlCalzone DAS WAR ES! Dachte irgendwie er führt das Skript als user iobroker relativ aus, aber vmtl aus seiner js Instanz heraus.
Es klappt, wenn man jetzt den Ordner woanders anlegen lassen will, geht das dann überhaupt?
Danke euch!!!
-
@WurstDLX sagte in Exec unter JavaScript führt Shell Script nicht aus:
wenn man jetzt den Ordner woanders anlegen lassen will
Du könntest sowas probieren:
exec("cd /woanders && /home/iobroker/testscript.sh", ...)