Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. exec befehl mit root Berechtigung (SONOSAPI)

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    exec befehl mit root Berechtigung (SONOSAPI)

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

      Hallo,

      In letzter Zeit muss ich sehr oft die Sonos API über die Konsole neu starten damit meine Sonos Lautsprecher wie gewünscht die Radiosender etc. umschalten.

      Dazu muss ich per SSH den Befehl:

      sudo systemctl restart sonosapi.service
      

      eingeben.

      gern würde ich das über ein einfaches Blockly automatisieren jedoch benötige ich für den Befehl root Rechte bzw. das PW muss mit übergeben werden.
      Mit einen einfachen

      8db50890-89cb-465f-92bc-d0cbc4205e69-image.png

      geht es nicht (fehlt ja auch das root PW ohne sudo kommt zugriff verweigert).

      Wie könnte ich es lösen?

      Meister Mopper OliverIO 2 Replies Last reply Reply Quote 0
      • Meister Mopper
        Meister Mopper @XBiT last edited by

        @xbit sagte in exec befehl mit root Berechtigung (SONOSAPI):

        Wie könnte ich es lösen?

        Ein sauber installiertes Debian verlangt kein root-Passwort.

        Und auch bei Virtualsisierungssystemen ist die Anlage und Verwendung eines normalen Users mit sudo-Rechten immer die bessere Variante.

        XBiT 1 Reply Last reply Reply Quote 0
        • XBiT
          XBiT @Meister Mopper last edited by XBiT

          @meister-mopper

          hilft mir jetzt nicht so viel weiter.. melde ich mich als Benutzer per SSH an welcher sudo Rechte hat (was ich immer mache) und gebe den Befehl "sudo systemctl restart sonosapi.service" wird immer erneut das PW vom User abgefragt.

          97699b61-0220-447e-99e9-bae6d84c04f9-image.png

          Thomas Braun 1 Reply Last reply Reply Quote 0
          • Thomas Braun
            Thomas Braun Most Active @XBiT last edited by

            @xbit

            Dann ändere die Rechte für den Service so ab, das da auch ein normaler user Zugriff hat.
            Zum Beispiel über die Gruppe 'iobroker'.

            1 Reply Last reply Reply Quote 0
            • OliverIO
              OliverIO @XBiT last edited by

              @xbit

              Grundsätzlich sollte das Problem an der Wurzel gelöst werden, warum dieser Dienst neu gestartet werden muss. Dazu kannst du auch mal in die Logdateien des Dienstes reinschauen, ob dort Fehler oder Problem Hinweise stehen.

              Ein und ausschalten, oder virtuelles mit dem Fuß dagegen treten Ist wahrscheinlich nur eine temporäre Lösung.

              um dir dennoch zwischenzeitlich zu helfen, kannst du mal auf der folgenden Seite schauen.
              https://wiki.ubuntuusers.de/sudo/Konfiguration/
              Darüber kannst du die Passwort Eingabe für bestimmte User, für bestimmte Programme aufheben. Bitte lese dir die komplette Seite von oben bis unten durch und beachte insbesondere den roten Kasten.. Durch falsches bearbeiten kannst du dir dein System zerstören.

              Achte auch darauf, dass du die Berechtigung den User iobroker vergeben musst. Das ist der User der vom Blockly aus verwendet wird

              1 Reply Last reply Reply Quote 1
              • J
                jwerlsdf last edited by jwerlsdf

                Hi,
                Ich hatte ein ähnliches Problem. Bei einem Neustart sollte ein Befehl an raspberry gesendet werden. Das PW sollte dabei mitgegeben werden. Mit blockly habe ich es nicht hinbekommen, mit Java gings.
                Das Skript macht folgendes. Es überprüft den Datenpunkt mpd info connect auf false. Ist dieser auf false, wird sich auf dem raspberry mit pw eingeloggt jnd der sudo Befehl abgewendet.

                Vielleicht hilft dir das Skript weiter. Habe dir noch einige Anmerkungen reingeschri3ben

                const { Client } = require('ssh2'); // Importiere die ssh2 Bibliothek
                
                // Konfiguration für den Raspberry Pi MPD (IP, Benutzername und Passwort)
                const raspberryMPDConfig = {
                  host: '192.168.XXX.XX', // IP-Adresse von Raspberry Pi MPD
                  port: 22,
                  username: 'pi', // Benutzername auf Raspberry Pi MPD
                  password: 'XXX' // Passwort für den Benutzer
                };
                
                let sshErrorLogged = false; // Flag, um Fehler nur einmal zu protokollieren
                
                // Funktion, die den Befehl an Raspberry Pi MPD sendet
                function sendCommandToRaspberryMPD() {
                  const conn = new Client();
                
                  // Verbindung zu Raspberry Pi MPD herstellen
                  conn.on('ready', () => {
                    // Den Befehl "sudo service mpd start" ausführen
                    conn.exec('sudo service mpd start', (err, stream) => {
                      if (err) {
                        if (!sshErrorLogged) {
                          console.error('Fehler beim Ausführen des Befehls:', err); // Fehler nur einmal loggen
                          sshErrorLogged = true; // Fehler flag setzen
                        }
                        conn.end();
                        return;
                      }
                
                      stream.on('data', () => {
                        // Keine Ausgabe mehr aufzeichnen
                      });
                
                      stream.on('close', () => {
                        conn.end(); // Verbindung schließen
                      });
                    });
                  }).on('error', () => {
                    if (!sshErrorLogged) {
                      console.error('Fehler bei der SSH-Verbindung.'); // Fehler nur einmal loggen
                      sshErrorLogged = true; // Fehler flag setzen
                    }
                  }).connect(raspberryMPDConfig);
                }
                
                // Event-Listener für den Datenpunkt mpd.0.info.connection
                on({ id: 'mpd.0.info.connection', val: false }, async (obj) => {
                  let value = obj.state.val;  // Der aktuelle Wert des Datenpunkts
                  let oldValue = obj.oldState.val;  // Der vorherige Wert des Datenpunkts
                
                  if (value === false) {
                    sendCommandToRaspberryMPD();
                  } else {
                    sshErrorLogged = false; // Fehlerflag zurücksetzen, wenn der Wert nicht mehr false ist
                  }
                });
                
                1 Reply Last reply Reply Quote 1
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                902
                Online

                31.7k
                Users

                79.7k
                Topics

                1.3m
                Posts

                5
                6
                184
                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