Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [offen] root Rechte für exec()

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [offen] root Rechte für exec()

    This topic has been deleted. Only users with topic management privileges can see it.
    • ruhr70
      ruhr70 last edited by

      @Solear:

      Muss eigentlich als root installiert gewesen sein, sonst würde er den reboot-Befehl ja auch nicht ausführen. `

      Der reboot Befehl war nicht von mir, sondern aus der Doku entliehen.

      Als Beispiel dafür, dass Befehle als root ausgeführt werden können.

      Kann ich nachträglich rausfinden, ob ich wirklich als root ioBroker installiert habe (gehe ich eigentlich von aus).

      Ich habe gerade noch ein "sudo chmod 777 /opt/iobroker" ausgeführt (bei laufendem ioBroker).

      Das brachte keine Veränderung beim exec()

      1 Reply Last reply Reply Quote 0
      • ruhr70
        ruhr70 last edited by

        @BuZZy:

        AlCalzone geht in die richtige Richtung:````
        exec('sudo su -c "npm i npm@latest-4 -g" root');

        
        So könnte es auch gehen falls Passworteingabe benötigt wird:
        

        exec('echo -e "DEINPASSWORT\n" | sudo -S npm i npm@latest-4 -g')

        
        Gruß `  
        

        hat leider nicht funktioniert.

        Bei der ersten Variante:

        'sudo su -c "cat /var/lib/update-notifier/updates-available" root'
        
        ->
        javascript.0	2018-01-18 18:06:48.751	error	sudo: Kein TTY vorhanden und kein »askpass«-Programm angegeben
        javascript.0	2018-01-18 18:06:48.751	error	script.js.Systeminfos.Host.Ubuntu_Updates: Error: Command failed: sudo su -c "cat /var/lib/update-notifier/updates-available" root
        

        Und bei der zweiten Variante:

        'echo -e "passwort\n" | sudo -S cat /var/lib/update-notifier/updates-available';
        
        ->
        javascript.0	2018-01-18 18:11:29.153	error	script.js.Systeminfos.Host.Ubuntu_Updates: Error: Command failed: echo -e 'passwort ' | sudo -S cat /var/lib/update-notifier/updates-available [sudo] Passwort für michael: Das hat nicht funktioniert, bitte nochmal probieren. [sudo] Passwort für michael: Das hat nicht funktioniert, bitte nochmal probieren. [sudo] Passwort für michael: sudo: 2 Fehlversuche bei der Passwort-Eingabe
        

        Was bei der 2. Variante auffällt:

        echo -e 'passwort '
        

        Hier kommt im Log hinter dem Passwort und vor dem Hochkomma noch ein Leerzeichen.

        1 Reply Last reply Reply Quote 0
        • ruhr70
          ruhr70 last edited by

          @Dutchman:

          Läuft ioBroker unter root? Wenn nein kann man auch kein exec mit root ausführen `

          Ich frage Dich auch einmal :mrgreen:

          Habe ich denn die Chance rauszufinden, ob ich ioBroker als root installiert habe, bzw. kann man das nachträglich ändern?

          1 Reply Last reply Reply Quote 0
          • BuZZy
            BuZZy last edited by

            exec('sudo -S su -c "npm i npm@latest-4 -g" root');
            ````:mrgreen:
            
            Probier es nochmal mit -S hinter sudo..
            
            Sonst hab ich keine Idee mehr.. :lol:
            
            Gruß
            1 Reply Last reply Reply Quote 0
            • ruhr70
              ruhr70 last edited by

              @BuZZy:

              exec('sudo -S su -c "npm i npm@latest-4 -g" root');
              ````:mrgreen:
              
              Probier es nochmal mit -S hinter sudo..
              
              Sonst hab ich keine Idee mehr.. :lol: `  
              

              mmhh… jetzt kommt kein Fehler, dafür kommt nach dem exec() gar keine Rückmeldung mehr...

              Die Abfrage:

              'sudo -S su -c "cat /var/lib/update-notifier/updates-available" root'
              

              Die Logs vor und nach dem exec()

              ...
                  if(logOn) log("Abfrage wird angestossen");
                  exec(abfrage, function(err, stdout, stderr) {
                      if (err) {
                          log(err,"error");
                          return;
                      }
                      if(logOn) log("Test Abfrage durchgeführt");
              ...
              
              

              Nur das erste Log wird ausgegeben.

              Wäre schön, wenn das funktioniert hätte.

              Aber ich befürchte, dass meiner Installation die root Rechte fehlen.

              Das wäre dann meine Hoffnung, dass da jemand weiß, wie es geht.

              Danke für Deine Mühe!

              1 Reply Last reply Reply Quote 0
              • ?
                A Former User last edited by

                Hallo Zusammen,

                ein Password im Rahmen eines Scriptes zu SU zu übergeben dürfte unter Linux NICHT gehen….. (meine Erfahrung) 🙂

                Dazu sollte, wenn es denn sicher sein sollte expect verwendet werden.

                Bitte mal nach Expect googlen.

                Bei mir wird das Root Passwort beständing rotiert, bei Bedarf checke ich das Password aus und übergebe es an die

                notwendigen Programme via Skript.

                Im Falle von "SU Root" um mir eine Rootshell temporär zu generieren verwende ich im Skript.

                my $suCaller = 'expect -c "set timeout 20; spawn -noecho su - ' . $tarUser . '; expect "Password:"; send "' . $tarPassword . '\r"; interact;"';

                My 2 Cents

                Equilora

                1 Reply Last reply Reply Quote 0
                • ruhr70
                  ruhr70 last edited by

                  @equilora:

                  Im Falle von "SU Root" um mir eine Rootshell temporär zu generieren verwende ich im Skript.

                  my $suCaller = 'expect -c "set timeout 20; spawn -noecho su - ' . $tarUser . '; expect "Password:"; send "' . $tarPassword . '\r"; interact;"';

                  My 2 Cents

                  Equilora `

                  Danke für den Input. Ich muss zugeben, dass ich kein Wort verstanden habe. Einen Artikel zu expect lese ich gerade.

                  Momentan verstehe ich nicht, wie das anzuwenden wäre :?

                  1 Reply Last reply Reply Quote 0
                  • ?
                    A Former User last edited by

                    Jo Ruhr70,

                    wollte Dich nicht verwirren….

                    Wenn Du in der Linux Shell z.b "su root" eingibst.... dann kommt sicher ein Propmt, welcher nach dem Password frägt.

                    Das kannst Du mit den üblichen Shell Scripts nicht mehr automatisiert erledigen, ausser Deine Linux Distribution ist noch aus der Steinzeit.

                    Passwörter im Klartext in Skripts ist mittlerweile verboten 🙂 🙂

                    Deswegen der Umweg mittels Expect.

                    Equilora

                    1 Reply Last reply Reply Quote 0
                    • ruhr70
                      ruhr70 last edited by

                      @equilora:

                      Passwörter im Klartext in Skripts ist mittlerweile verboten 🙂 🙂

                      Deswegen der Umweg mittels Expect.

                      Equilora `

                      Mein root Passwort hätte ich auch höchst ungern in das Skript gepackt.

                      Den Umweg über Expect verstehe ich allerdings nicht, bzw. Deine Beispielzeile.

                      Ich welche Richtung muss ich denken?

                      Gehört das ins ioBrkoer Javascript (da würde die Syntax nicht passen)?

                      In ein Skript unter Linux?

                      Ein schnelles google brachte mich gar nicht weiter.

                      Ein kleiner Schubser, in welche Richtung ich da überhaupt denken muss.. :roll:

                      Wie wende ich Deine Zeile in Verbindung mit meinem Skript an?

                      1 Reply Last reply Reply Quote 0
                      • ?
                        A Former User last edited by

                        Hallo Ruhr70,

                        du verwendest EXEC damit führst Du ja Befehle auf der OS Ebene aus…..

                        Deswegen kannst Du Expect innerhalb der IOB Skript Umgebung verwenden.

                        Achtung Expect muss unter Umständen nachinstalliert werden (z.B Debian).

                        Der Hintergrund ist einfach... mittels Expect rufst Du OS Befehle auf welche z.B ein Password brauchen, expect kapselt diese Programme und erlaubt dann

                        z.B das Passwort via Skript zu senden, was im Umfeld einer Bash nicht funktionieren würde.

                        Noch mehr verwirrt?

                        Equilora

                        1 Reply Last reply Reply Quote 0
                        • ruhr70
                          ruhr70 last edited by

                          @equilora:

                          Noch mehr verwirrt?

                          Equilora `

                          Nein. Das habe ich verstanden 🙂

                          Danke für die Erläuterung!

                          Wie verwendest Du denn Deine Zeile im Skript?

                          Mit den Anführungszeichen und Hochkommas passt das nicht so im Skript. Deine Kommando öffnet dann eine Root Shell. Wie kommt dann das gewünschte Kommando von mir zum Zuge!

                          Danke noch einmal für die Erklärung!

                          Gesendet von iPad mit Tapatalk

                          1 Reply Last reply Reply Quote 0
                          • ?
                            A Former User last edited by

                            Hallo Ruhr70,

                            entschuldige die holperige Konversation wir hatten einen heftigen Sturm hier und ich musste erstmal die Pferde ruhig bekommen und hier hat es grad ein Baum die Stromleitung geknickt….

                            Mein Beispiel ist ein wenig holperig weil basierend auf Perl...

                            my $suCaller = 'expect -c "set timeout 20; spawn -noecho su - ' . $tarUser . '; expect "Password:"; send "' . $tarPassword . '\r"; interact;"';

                            Mittels exec rufst Du expect -c "set timeout ....

                            ist warten das expect geladen wurde

                            -nonecho ist eine Option welche Rückmeldungen unterdrückt,

                            die $dingsda sind Parameter welche als Variablen vorliegen, welche ich dann einfach abrufe....

                            Im Grunde muss das ganze nur in Java Script Notation verpackt werden.....

                            Ich such mir mal ein paar Fälle wo root zwingend notwendig ist ohne gleich das gesamte System herunterfahren zu müssen, bin wie die Anderen

                            auch noch beruflich tätig... please stay tuned.

                            Equilora

                            1 Reply Last reply Reply Quote 0
                            • ruhr70
                              ruhr70 last edited by

                              Oh je, der Sturm hat Dich ja ganz schön erwischt.

                              Ich danke Dir jedenfalls für die ausführlichen Erklärungen und Deine Geduld!

                              1 Reply Last reply Reply Quote 0
                              • ?
                                A Former User last edited by

                                Hi Ruhr70,

                                man(n) baut für Katastrophen vor… 🙂

                                @ruhr70:

                                Oh je, der Sturm hat Dich ja ganz schön erwischt.

                                Ich danke Dir jedenfalls für die ausführlichen Erklärungen und Deine Geduld! `

                                Ich kann das erstmal nur als Prototyp bauen. Das Password für Root muss ich aus diesem Grund erstmal deklarieren als Variable und fest einbinden, da wohl kaum jemand hier seine Passwörter rotiert, jede paar Stunden diese ändert, und über einen Web Service abruft und nach Gebrauch, Rückgabe, Erledigung einer Aufgabe wieder rotiert. :)…... Bluefox killt mich ohnehin da ich Exec verwende 🙂

                                Wo am Ende das Password hinterlegt wird, das darfst Du selbst festlegen.....

                                In Linux sind einige Aufgaben nur mit Root Rechten ausführbar... z.b Port 80 einstellen.... alle Ports unter 1024 geht nur mit Root, auf eine Hardwareschnitte zugreifen zur Laufzeit geht auch nur mit Root Rechten usw usw....

                                Expect ist StdIn and StdOut - Shit in and Shit Out.. bei Dir also Ubuntu.... hab mit grad ein Image gebaut...

                                Equilora

                                1 Reply Last reply Reply Quote 0
                                • ruhr70
                                  ruhr70 last edited by

                                  @equilora:

                                  In Linux sind einige Aufgaben nur mit Root Rechten ausführbar… z.b Port 80 einstellen.... alle Ports unter 1024 geht nur mit Root, auf eine Hardwareschnitte zugreifen zur Laufzeit geht auch nur mit Root Rechten usw usw....

                                  Expect ist StdIn and StdOut - Shit in and Shit Out.. bei Dir also Ubuntu.... hab mit grad ein Image gebaut...

                                  Equilora `

                                  Machst Du das eigentlich beruflich oder warum bist Du da so tief drin?

                                  1 Reply Last reply Reply Quote 0
                                  • lost in translation
                                    lost in translation last edited by

                                    Ist das mittlerweile gelöst?
                                    Ich würde ebenfalls in einem exec gerne sudo machen auf einen anderen user, damit scp funktioniert.

                                    ciao
                                    frank

                                    AlCalzone 1 Reply Last reply Reply Quote 0
                                    • AlCalzone
                                      AlCalzone Developer @lost in translation last edited by

                                      @lost-in-translation Wenn du eine halbwegs aktuelle Installation hast, musst du dem User iobroker erlauben, sich als der andere User anzumelden.

                                      Dazu legst du am besten in /etc/sudoers.d eine Datei ab, z.B. iobroker-scp oder so. Darin definierst du, dass iobroker ein bestimmtes Kommando als ein anderer User ausführen darf. Ich nenne diesen User hier mal frank:

                                      iobroker  ALL=(frank) NOPASSWD: /pfad/zu/scp
                                      

                                      Den vollständigen Pfad zur scp binary findest du per which scp.

                                      Zum Erstellen der Datei am besten visudo verwenden, weil da gleich eine Prüfung auf Syntaxfehler ausgeführt wird, die im schlimmsten Fall zu nicht-Funktionieren von sudo führen. Mehr Details hier:
                                      https://kofler.info/sudo-ohne-passwort/

                                      Ich empfehle, sonst nichts zu ändern. Die Berechtigungen sind extra so gewählt, dass das System möglichst sicher im Umgang mit root-Rechten ist.

                                      1 Reply Last reply Reply Quote 1
                                      • A
                                        aleks-83 last edited by

                                        Hallo,

                                        ich habe auch (wieder) ein Problem mit den Rechten meiner Installation.
                                        Es lief ca. 6 Monate, und jetzt seit 2 Monaten läuft es nicht mehr.
                                        Ob es mit einem Update zusammenhängt oder andere Ursachen hat kann ich jetzt nicht mehr sagen.
                                        Mir ist es erst jetzt aufgefallen.

                                        Wenn jemand bei mir klingelt kopiere ich Snapshots der Kamera auf ein NAS.
                                        mit dem Befehl

                                        cp -r /opt/iobroker/iobroker-data/files/vis.0/main/snapshots/Set1/ /mnt/DS112/FOTO/Besucherfotos/2019/2019.08.06_14.19.11/
                                        

                                        Dieser wird wohl auch immer noch abgesetzt, aber nicht mehr korrekt umgesetzt. Denn die Fotos liegen zwar im iobroker, aber nicht auf dem NAS. (Die letzten wurden eben vor 2 Monaten raus kopiert)
                                        Wenn ich den Befehl im putty eingebe (angemeldet als root), funktioniert es.
                                        In der sudoers.d habe ich folgende Anpassung gemacht:

                                        iobroker        ALL=(ALL) NOPASSWD: /opt/iobroker/iobroker-data/files/vis.0/main/snapshots/
                                        

                                        Das scheint aber nicht auszureichen. Es funktioniert trotzdem nicht.

                                        Was kann ich noch tun?

                                        AlCalzone 1 Reply Last reply Reply Quote 0
                                        • SBorg
                                          SBorg Forum Testing Most Active last edited by

                                          Hat denn der User "iobroker" überhaupt Schreibrechte auf deinem NAS?

                                          1 Reply Last reply Reply Quote 0
                                          • AlCalzone
                                            AlCalzone Developer @aleks-83 last edited by

                                            @aleks-83 sagte in [offen] root Rechte für exec():

                                            In der sudoers.d habe ich folgende Anpassung gemacht:
                                            iobroker ALL=(ALL) NOPASSWD: /opt/iobroker/iobroker-data/files/vis.0/main/snapshots/

                                            In der sudoers.d musst du Befehle angeben, nicht Ordnerpfade. Überprüfe mal, was @SBorg gefragt hat. iobroker bzw. ein User mit der gleichen UID benötigt Schreibzugriff aufs NAS.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            800
                                            Online

                                            31.7k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript
                                            10
                                            55
                                            8084
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo