HDMI output mit Apache2

  • Schönen guten Tag liebe Community,

    Ich hätte da mal eine Frage. Und zwar habe ich auf meinem Raspi (Raspberrypi 4, 4Gb Ram standard Raspbian OS) einen Apache2 Server installiert (standard Installation...). Dafür habe ich nun eine PHP Seite geschrieben (in PHP 7.3), die erstmal wie ein ganz normaler Dateiexplorer auf dem Raspi funktioniert und erstmal nur aus dem Heimnetz erreichbar ist. Der Sinn dahinter ist, dass der Raspi via HDMI an einen TV angeschlossen ist und ich gerne vom Handy aus über die Website einzelne Dateien des Raspi (wie zum Beispiel Bilder) auf dem TV anzeigen würde. Das Problem ist nun, dass sich die Dateien nicht anzeigen/öffnen lassen.
    Zum öffnen verwende ich in PHP folgenden Befehl (passthru sollte ja soweit ich weis wie shell_exec funktionieren):
    passthru("sudo xdg-open /home/pi/image.jpg");
    (image.jpg ist in diesem Fall einfach nur irgendein Testbild mit dem es eben bereits nicht funktioniert)
    Hier kommt auch keine Fehlermeldung, es passiert einfach nichts. Wenn ich den Befehl im Terminal ausführe funktioniert auch alles soweit. Das heißt es öffnet sich das Bild im standard Bildbetrachter. Ich würde das nur wie gesagt gerne über PHP machen um es auch vom Handy aus (über die Website) steuern zu können.
    Die PHP Seite, sowie das Bild gehören beide dem Standard Benutzer 'root'.

    Falls jemand eine Idee hat, woran das liegen könnte, würde ich mich sehr über eine Rückmeldung freuen!

    Und falls ich noch eine wichtige Information vergessen habe, verzeiht es mir bitte, ist mein erster Beitrag hier ;)

    Viele Grüße,
    Marius

    • Official Post

    Ich sehe hier mindestens zwei Fallstricke. Erstens der User mit des Apache (www-data) darf kein sudo verwenden und das ist auch gut so und zweitens soll die Ausgabe auf dem TV erscheinen.

    Für erstens könnte man die Gruppenrechte der Bilder anpassen.

    Für zweitens könnte man es mit einem DISPLAY=:0 vor den Befehl setzen versuchen.


    Zum Verständnis... Das ist es eine Server (Webserver) - Client (Browser am RPi via Tv und Browser am Telefon) Geschichte. Wenn ich im Forum diesen Thread aufrufe, dann erscheint der ja auch nicht bei allen Usern auf dem Bildschirm. ;)


    //Edit Was spricht eigentlich gegen shell_exec?

  • Alles klar, schon mal Danke für den Tipp! Leider kommt jetzt die Fehlermeldung 'option parsíng failed: cannot open display:'. Mit den Displays und so kenn ich mich leider nicht aus...


    Und gegen shell_exec spricht eigentlich nur, dass ich dann keine Fehlermeldung zurückbekomme :)

  • hyle: und zweitens soll die Ausgabe auf dem TV erscheinen.

    Ok, so formuliert habe ich es verstanden.


    In diesem Fall ist fpassthru ganz sicher nicht der richtige Ansatz. Das gibt den Inhalt eines Files an den Browser aus!

    • Official Post

    Und gegen shell_exec spricht eigentlich nur, dass ich dann keine Fehlermeldung zurückbekomme

    Ganz im Gegenteil: https://www.php.net/manual/de/function.shell-exec.php


    Oder halt exec() verwenden.


    Vielleich funktioniert das auch ohne DISPLAY..., imho wird das aber nötig sein.

  • Okay, ich schätze mal das liegt daran, dass der user www-data keine Berechtigung oder so hat, um das Display zu öffnen. Jedenfalls wenn ich mit dem normalen User pi den Befehl im Terminal ausführe und als www-data funktioniert es eben nicht. Da kommt 'no protocol specified'. Liegt das tatsächlich irgendwie an den Rechten von www-data?

    • Official Post

    Wie sieht die Zeile mit dem Aufruf aktuell aus? Und was ist die Komplette Fehlermeldung?


    Btw. Da ich nichts über Deine Konfiguration weiß könnte es übrigens auch die 1 statt der 0 nach Display... sein.


    Oh, da haben sich unsere Antworten überschnitten.


    Gruppenrechte von www-data könnten eine mögliche Fehlerquelle sein, die Umgebungsvariablen inkl. fehlendes home-Verzeichnis, den XDG-Einstellungen usw. was ein normler User mitbringt ebenfalls.


    Für solche Aktionen ist ein Webserver einfach nicht gedacht!

  • Die PHP Seite, sowie das Bild gehören beide dem Standard Benutzer 'root'.

    'root' ist kein Standard Benutzer. Ganz im Gegenteil.

  • Okay, danke. Ich schau mal, was sich da so machen lässt mit Gruppenrechten, Home verzeichnis usw... Dass ein Webserver dafür nicht gedacht ist, dachte ich mir schon, hatte aber die Hoffnung es trotzdem noch irgendwie hinzubekommen, bzw. war auch einfach meine erste Idee... Ansonsten bin ich natürlich auch für ganz andere Vorschläge an das Thema ran zu gehen offen.

  • Für solche Aktionen ist ein Webserver einfach nicht gedacht!

    Ein (Web-)Server liefert die vom Client angeforderten Daten an diesen aus.


    Du brauchst neben dem Webserver am Pi einen Client, also einen Webbrowser, der vom Handy aus ferngesteuert wird.


    www-data ist ein Systemuser (uid < 1000 ) und hat weder ein Homeverzeichnis, noch ein Login oder eine Grafikkonfiguration. Er kann allerhöchstens als Gruppenmitglied von video ein passendes "Frame" in ein Frambufferdevice schreiben.


    Servus !

    RTFM = Read The Factory Manual, oder so

    • Official Post

    andere Vorschläge

    Z.B. Um Bilder am TV anzuzeigen würde ich miniDLNA auf dem RPi installieren, den RPi und den TV einfach ans Heimnetz hängen. Damit kann man per TV-Fernbedienung seine Bilder ansehen. Dafür muss der RPi auch nicht mit dem TV per HDMI verbunden sein.

  • > ansonsten bin ich natürlich auch für ganz andere Vorschläge an das Thema ran zu gehen offen

    Es sollte eigentlich moeglich sein, ich hab's aber nur rudimentaer probiert:

    * https://blog.heimetli.ch/udp-execute.html holen und uebersetzen (die Version unten auf der Seite)

    * starten als User pi

    Code
    $ ./udpexec 2048 /bin/echo
    udpexecute V1.20

    * das PHP-Script dazu sieht so aus

    PHP
    <?php
        $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    
        $msg = "Ping !";
        $len = strlen($msg);
    
        socket_sendto($sock, $msg, $len, 0, '127.0.0.1', 2048);
        socket_close($sock);
    ?>
  • > ansonsten bin ich natürlich auch für ganz andere Vorschläge an das Thema ran zu gehen offen

    Es sollte eigentlich moeglich sein, ich hab's aber nur rudimentaer probiert:

    * https://blog.heimetli.ch/udp-execute.html holen und uebersetzen (die Version unten auf der Seite)

    * starten als User pi

    Code
    $ ./udpexec 2048 /bin/echo
    udpexecute V1.20

    * das PHP-Script dazu sieht so aus

    PHP
    <?php
        $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    
        $msg = "Ping !";
        $len = strlen($msg);
    
        socket_sendto($sock, $msg, $len, 0, '127.0.0.1', 2048);
        socket_close($sock);
    ?>

    Alles klar, vielen Dank dafür. Das hört sich doch gut an. Das ist ja auch das, was RTFM meinte oder? In diesem Fall ist praktisch das PHP-skript der Client und sendet dann über den socket die Daten an das udp script oder?


    hyle: miniDLNA wäre natürlich auch eine Idee, ich wollte aber die Möglichkeit haben es mit dem Handy zu steuern und werde deshalb jetzt mal die oben genannte Methode probieren.


    Vielen Dank euch allen!

  • Ich hab's mal auf Knoppix probiert. Dort funktioniert es so:

    * Zeile 72 im .cpp auskommentieren damit xdg-open nicht motzt

    * absoluten Pfad angeben fuer xdg-open -> ./udpexecute 2048 /usr/bin/xdg-open


    Das Bild wird angezeigt wie gewunscht. (-: Wahrscheinlich kommt gleich die naechste Frage: wie geht es wieder zu :)

  • Ja vielen Dank bei mir funktionierts jetzt auch :thumbup:

    Du darfst mir natürlich gerne noch verraten, wie man es wieder schliesen kann ;)

  • > Ja vielen Dank bei mir funktionierts jetzt auch :thumbup:

    Na Bravo!


    > Du darfst mir natürlich gerne noch verraten, wie man es wieder schliesen kann ;)

    Unter Knoppix nimmt xdg-open gpicview fuer JPGs. Das koennte auf dem Raspi anders sein (checken).


    gpicview laesst sich nur mit Maus und Tastatur bedienen, darum muss man ihn killen. Aber natuerlich erst wenn das neue File darueber liegt. Das folgende Script erledigt das:


    Ausfuehren:


    Code
    ./udpexec 2048 /bin/bash show.sh