Zugriff auf Dateien über Webbrowser nach Automount

  • Servus Kollegen, ich bräuchte mal bitte wieder Euren weisen Ratschlag ;)

    In meinem Pi lasse ich über dieses Script hier per udev USB-Sticks mounten, wenn diese eingesteckt werden.

    Funktioniert grundsätzlich.

    Nun möchte ich aber über den Webbrowser auf die Dateien des USB-Stick lesend zugreifen.

    Per PHP lasse ich die Dateien auflisten und auf einer Webseite darstellen. Der Code lautet:

    Nun ist es natürlich so, dass der Webserver (Apache2) den Downloadlink ab seinem Webroot setzt. Sprich: Auf die physikalische Datei unter (z.B.) /media/sdb1.ext2 kann ich nicht zugreifen.

    Ich bin am hin und herrätseln, komme aber auf keinen grünen Zweig.

    BTW: Bookworm, Apache2, PHP 8, MariaDB

    Any ideas?

  • Zugriff auf Dateien über Webbrowser nach Automount? Schau mal ob du hier fündig wirst!

  • Du brauchst ja einen relativen Pfad zum Document Root des Servers.

    Nein, den brauchst du nicht wenn du den absoluten Pfad angibst.
    In dem Fall greift nicht der Webserver auf den Pfad zu sondern PHP mit rechten vonm User www-data.
    Der User www-data muss nur den gemounteten Datenträger auch lesen dürfen.
    Das muss er übrigens auch dürfen wenn er nach /var/www/* gemountet wird.

    Offizieller Schmier und Schmutzfink des Forum.
    Meine PI:

    Display Spoiler

    #1 : Pi1 - Packet Radio Digi mit TNC-PI
    #2 : Pi2 - ADSB Feeder
    #3 : Pi3 - DHCP/DNS Server für 4 VLAN
    #4 : Pi3 - Wireguard Gateway
    #5 : Pi3 - FM Funknetz Gateway mit Shari SA818
    #6 : PI Zero W mit DMR Hotspot
    #7 : Pi4 4GB - Kiosk Browser
    #8 : Pi4 4GB - Kiosk Browser
    #9 : Pi4 8GB - Test Pi

    Dazu noch ein paar Zero und Pi1/2 die noch auf einen sinnvollen Einsatz warten.

  • Nein, den brauchst du nicht wenn du den absoluten Pfad angibst.

    Ich wollte erst schreiben, Du "willst" statt Du "brauchst", aber das nur am Rande. :green_smile:

    In dem Fall greift nicht der Webserver auf den Pfad zu sondern PHP mit rechten vonm User www-data.

    Und was genau passiert dann am Monitor des Clienten? Öffnet sich der Dateimanager oder wird eine Liste der Dateien im Browser gezeigt?

    Das muss er übrigens auch dürfen wenn er nach /var/www/* gemountet wird.

    An dem Punkt bin ich mir gerade nicht so sicher, denn der Webserver zeigt ja auch Dateien an, die root oder einem normalen User gehören.

  • An dem Punkt bin ich mir gerade nicht so sicher, denn der Webserver zeigt ja auch Dateien an, die root oder einem normalen User gehören.

    Naja, Neben Besitzer und Gruppe gibt es noch 'other', und wenn der Zugriff erlaubt ist, kann man die zumindest lesen (r--). Trifft auf den meisten Dateien, die root gehören zu.

  • Und was genau passiert dann am Monitor des Clienten? Öffnet sich der Dateimanager oder wird eine Liste der Dateien im Browser gezeigt?

    Steht doch im Script in #1 was passiert.
    Dass Script grast den Ordner /media ab und gibt einen href link für jede Datei zurück die es in den Ordern / Unterordnern findet, wenn der User www-data in dem Verzeichnis lesen darf.

    Im Erfolgsfall bekommst du Links zu den Dateien angezeigt, im Fehlerfall nix oder ein Error 500, keine Ahnung, müsste ich nachstellen.
    Wichtig ist halt, wie Bergwichtel schon erwähnte, das others oder www-data da auch lesen darf.

    Offizieller Schmier und Schmutzfink des Forum.
    Meine PI:

    Display Spoiler

    #1 : Pi1 - Packet Radio Digi mit TNC-PI
    #2 : Pi2 - ADSB Feeder
    #3 : Pi3 - DHCP/DNS Server für 4 VLAN
    #4 : Pi3 - Wireguard Gateway
    #5 : Pi3 - FM Funknetz Gateway mit Shari SA818
    #6 : PI Zero W mit DMR Hotspot
    #7 : Pi4 4GB - Kiosk Browser
    #8 : Pi4 4GB - Kiosk Browser
    #9 : Pi4 8GB - Test Pi

    Dazu noch ein paar Zero und Pi1/2 die noch auf einen sinnvollen Einsatz warten.

  • wie sieht die URL einer gemounteten Datei aus, die aufgerufen wird / werden soll

    Sorry, aneinander vorbei geredet :)
    Ja, die generierte URL wird nicht funktionieren, aber das ist ein anderes Thema.
    Entweder auf ein zweites PHP Script linken was die Datei liest und mit dem richtigen Header ausgibt oder einfach einen Symlink von /media ins webroot.
    Dann bauch ich den Automount unter /media nicht anpassen.

    Offizieller Schmier und Schmutzfink des Forum.
    Meine PI:

    Display Spoiler

    #1 : Pi1 - Packet Radio Digi mit TNC-PI
    #2 : Pi2 - ADSB Feeder
    #3 : Pi3 - DHCP/DNS Server für 4 VLAN
    #4 : Pi3 - Wireguard Gateway
    #5 : Pi3 - FM Funknetz Gateway mit Shari SA818
    #6 : PI Zero W mit DMR Hotspot
    #7 : Pi4 4GB - Kiosk Browser
    #8 : Pi4 4GB - Kiosk Browser
    #9 : Pi4 8GB - Test Pi

    Dazu noch ein paar Zero und Pi1/2 die noch auf einen sinnvollen Einsatz warten.

  • Sorry, aneinander vorbei geredet :)
    Ja, die generierte URL wird nicht funktionieren, aber das ist ein anderes Thema.

    Sehr gut, Problem erkannt! :green_wink:

    Symlink geht natürlich auch, aber den müsste man vermutlich jedesmal anpassen, wenn man nicht das komplette /media einbinden möchte. (Würde ich z.B. nicht wollen).

    Um den Umweg mit PHP einzelne Dateien lesen und "wiedergeben" zu vermeiden empfinde ich es als einfacher direkt im Docroot zu bleiben / navigieren.

    BTW: Wenn man nur das hier oben genannte möchte und nichts weiter "drumherum" im Webserver ist, dann wäre ein einfacher Python-Webserver im /media gestartet, viel einfacher. :green_smile:

  • hyle Die meisten Webserver bieten dynamischen Seiten einen Weg statische Dateiinhalte effizient über den Webserver ausliefern zu lassen. Man muss da also nicht in PHP die Datei einlesen und an den Client schicken, sondern kann dem Server einfach mitteilen wo er die Datei findet, die er ausliefern soll.

    “Sich zu Tode zu arbeiten ist die einzige gesellschaftlich anerkannte Art des Selbstmordes.” — Johann Freudenreich

  • Die meisten Webserver bieten dynamischen Seiten einen Weg statische Dateiinhalte effizient über den Webserver ausliefern zu lassen

    Wie Du richtig schreibst:

    sondern kann dem Server einfach mitteilen wo er die Datei findet, die er ausliefern soll.

    und wenn die nicht im Document Root liegen oder dahin verlinkt sind oder das Docroot per Alias oder VHost usw. dahin gelegt wurde, muss man halt den Umweg über z.B. PHP gehen.

  • hyle Die Datei muss dafür nicht im Document-Root liegen. Es geht nicht um URLs zu statischen Dateien die vom Client kommen, sondern das ein dynamisches Skript dem Server sagen kann „liefere diese Datei aus“. Welche das ist, entscheidet das Skript dynamisch. Wo die auf dem Dateisystem liegt ist egal, solange der Webserver die entsprechenden Rechte hat die Datei zu lesen.

    “Sich zu Tode zu arbeiten ist die einzige gesellschaftlich anerkannte Art des Selbstmordes.” — Johann Freudenreich

  • hyle Normalerweise erzeugen die dynamischen Seiten (PHP, Python, Ruby, …) ja die Daten die an den Client zurück gesendet werden. Also wenn man Dateiinhalte ausliefern würde, dann müsste das Programm eben diese Datei auslesen und an den Client schicken. Es gibt aber auch die Möglichkeit, dass das Programm dem Webserver sagt welche Datei er ausliefern soll. Das passiert mit einem Header. Der Webserver ignoriert dann den Body, und schickt stattdessen den Inhalt der angegebenen Datei. Bei Apache geht das über einen Header (X-Sendfile). Man hat also keinen Overhead von einer interpretierten Sprache für das kopieren des Dateiinhalts, sondern der Webserver macht das so effizient wie er das für normale statische Dateien halt macht.

    “Sich zu Tode zu arbeiten ist die einzige gesellschaftlich anerkannte Art des Selbstmordes.” — Johann Freudenreich

  • Ah ok! X-Sendfile kannte ich nicht. Das ist dann natürlich eine richtig gute Alternative zum einlesen der Dateien. :thumbsup1:

    In einigen Fällen ist das sicher Sinnvoll. Das Verzeichnis mit den Dateien dem Webserver direkt sichtbar machen wäre hier aber dennoch die einfachste Lösung. :angel:

  • Ja, die generierte URL wird nicht funktionieren, aber das ist ein anderes Thema.
    Entweder auf ein zweites PHP Script linken was die Datei liest und mit dem richtigen Header ausgibt oder einfach einen Symlink von /media ins webroot.

    Den Symlink vom Webroot nach /media und die <Directory>-Direktive konfigurieren, das der Webserver auch dem Symlink folgen darf: <Directory>-Direktive
    Man sollte sich auch noch <Files> und <Location> anschauen.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!