Kommando geht aus Terminal, aber nicht aus Shell-Script - was ist mein Fehler?

hasenbein

Commander
Registriert
Feb. 2008
Beiträge
2.091
Hallo liebe Leute,

ich will foobar2000, ein Windows-Programm, das (übrigens sehr gut) unter Wine auf meinem Lubuntu-16.04-Rechner läuft, mit Kommandozeilenbefehlen fernsteuern können.

Nun kann ich problemlos die Wiedergabe von foobar2000 pausieren und wieder starten, indem ich in einem Terminal Folgendes eingebe:

wine "/home/hasenbein/.wine/dosdevices/c:/Program Files (x86)/foobar2000/foobar2000.exe" "/command:Play or Pause"

Nun habe ich ein Shellscript /var/foobar2000_playpause.sh erstellt, das genau diesen Befehl enthält und das von einer PHP-Seite des Webservers aufgerufen wird.
(Das funktioniert mit verschiedenen anderen Shellscripten bereits bestens, und wenn ich in foobar2000_playpause.sh einen jener anderen Befehle einsetze, wird dieser auch klaglos ausgeführt, d.h. der Aufruf und die Ausführung des Scripts funktionieren auf jeden Fall!)

Muss, wenn der Befehl sich in einem Script befindet, er syntaktisch anders formuliert werden?

Oder habe ich es mit einem Rechteproblem zu tun? (Was ich mir eigentlich nicht vorstellen kann...)

Über fachmännische Hinweise freue ich mich!

LG,
Hasenbein
 
Zuletzt bearbeitet:
Dein Webserver wird nicht als "hasenbein" laufen.
Protokolliere die Fehlerausgabe des Skripts wenn es von PHP aufgerufen wird.
 
Dein Problem ist die Pfadangabe, da fehlt vor home noch ein / und zusätzlich würde ich noch schauen ob dein Webserver auch die entsprechenden Rechte hat um wine auszuführen.
 
Das / vor home war da, habe mich nur hier vertippt.

Und die Rechte für /usr/bin/wine sind so gesetzt, dass jeder das Programm ausführen darf (Besitzer root).
 
Es geht nicht um die binaries. Die darf immer jeder ausführen. Nochmals: stderr protokollieren.
 
Wenn es php und apache2 ist der Webserver, ist der ausführende Benutzer www-data. Dieser hat aus Sicherheitsgründen wenig Rechte.

Übrigens hat foobar2000 auch ein plug-in zum steuern per Webserver. Ob das auch in wine funktioniert weiß ich allerdings nicht.
 
Zuletzt bearbeitet:
Also, Folgendes konnte ich herausfinden.

Ich habe schon seit Längerem in /etc/sudoers stehen, dass www-data die bisherigen Scripts ohne Passwortabfrage ausführen darf:

www-data ALL = NOPASSWD: /var/bereitsbestehendesscript.sh

So kann ich von der PHP-Datei aus mit exec ('sudo /var/bereitsbestehendesscript.sh') das Script mit Rootrechten ausführen. Das hat stets funktioniert.

Das Problem hier in diesem Falle ist jedoch offensichtlich, dass es mir nicht gelingt, das Script als hasenbein auszuführen!

Ich habe nun in /etc/sudoers hinzugefügt:

hasenbein ALL = NOPASSWD: /var/bereitsbestehendesscript.sh

Ändere ich den Code in der PHP-Datei jedoch ab in:

exec ('sudo -u hasenbein /var/bereitsbestehendesscript.sh'),

so kriege ich eine Fehlermeldung in /var/syslog: "no tty present and no askpass program specified".
Das heißt, trotz des /etc/sudoers-Eintrags will er bei dem sudo -u hasenbein - Befehl das Passwort abfragen.

Wie muss ich es richtig machen?

P.S.: Ja, es gibt eine foobar2000-Komponente httpcontrol, die benutze ich auch und steuere damit erfolgreich über eine App vom Android-Tablet fern, allerdings unterstützt die nur ganz bestimmte Befehle, und ich will u.a. ein Rescan der Library auf Knopfdruck übers Netz auslösen können, ohne dass ich an den Rechner einen Bildschirm anschließen muss, um die GUI von foobar2000 zu bedienen; außerdem einen schnellen Play-Pause-Knopf in die Benachrichtigungsleiste von Android legen.
Ergänzung ()

OK. Formuliere ich das Problem richtig, wenn ich es so sage?

Bisher durfte aufgrund der /etc/sudoers-Einträge der Benutzer www-data bestimmte Scripts über sudo als root ausführen, ohne Passwortabfrage.

Gesucht wird ein /etc/sudoers-Eintrag (?), der besagt, dass der Benutzer www-data ein bestimmtes Script über sudo -u hasenbein ohne Passwortabfrage als hasenbein ausführen darf.


Richtig?

Und was muss man in /etc/sudoers dafür eintragen?

GELÖST!

Habe in /etc/sudoers eingetragen:

www-data ALL=(hasenbein) NOPASSWD: /var/meinscript.sh

Und nun funktioniert es!
Danke für Eure Hinweise.

LG,
Hasenbein
 
Zuletzt bearbeitet:
Muss das Skript denn als root ausgeführt werden? Schau auf jeden Fall mal in die logs vom Webserver, welchen Fehler php zurückgibt.
 
Wie gesagt, hab's ja jetzt hingekriegt. Das Script muss aber unbedingt über sudo -u hasenbein als hasenbein ausgeführt werden, da foobar2000 auch unter jenem Benutzer läuft, und das geht halt mit obigem /etc/sudoers-Eintrag.

Ich lass das mal alles hier so stehen, denn derartige Foreneinträge sind immer nützlich für zukünftige Leute, die ein ähnliches Problem haben.

Ist doch jetzt prima: Ich kann über einfache HTTP-GET-Befehle nahezu beliebige Befehle an foobar2000 senden. So muss das :-)
 
Zuletzt bearbeitet:
hasenbein schrieb:
Ist doch jetzt prima: Ich kann über einfache HTTP-GET-Befehle nahezu beliebige Befehle an foobar2000 senden. So muss das :-)
foo_httpcontrol - File Browser, Playlist Support u.v.m. gleich inklusive. ;)
 
Ich habe doch etwas weiter oben geschrieben, dass httpcontrol viele Befehle - u. a. Rescan der Library - nicht unterstützt und ich deshalb eine allgemeinere Lösung brauche. Sonst hätte ich mich bestimmt nicht stundenlang hingesetzt und an obigem Problem geknobelt...
 
Warum willst du den Rescan denn manuell triggern? Foobar überwacht die eingetragenen Ordner doch und fügt neue Objekte automatisch zum Library hinzu.
 
Der soll nicht zu unpassenden Zeitpunkten rumrödeln, sondern nur dann, wenn ich will. Ist schon alles genau durchdacht, keine Sorge.
 
Zurück
Oben