NEWS
exec befehl mit root Berechtigung (SONOSAPI)
-
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 einfachengeht es nicht (fehlt ja auch das root PW ohne sudo kommt zugriff verweigert).
Wie könnte ich es lösen?
-
@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.
-
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.
-
Dann ändere die Rechte für den Service so ab, das da auch ein normaler user Zugriff hat.
Zum Beispiel über die Gruppe 'iobroker'. -
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
-
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 } });