Script wird von php nicht richtig ausgeführt

  • Hallo Zusammen,


    zu aller erst: ich bin komplett neu im Thema Linux. Sollte ich also einen Anfängerfehler machen und Ihr erkennt das sofort, so habe ich nichts dagegen, wenn Ihr einfach einen Artikel verlinkt, den ich durchforsten muss um mein Problem zu lösen.


    Ganz kurz zur Vorgeschichte: Ich habe vor den Pi in eine Steuerung für ein Gerät zu verwandeln, welches dann flexibel eingesetzt werden kann. Der Pi dient dabei als Webserver mit einer kleinen Steuerungsoberfläche. Damit ich am Gerät kein Display brauche, möchte ich es so einrichten, dass man ihn per LAN an ein Netzwerk anschließt, dann per DNS-Name aufruft und über ein kleines Menü mit dem WLAN verbinden kann. Wie genau ich das bewerkstellige, muss ich noch überlegen. Momentan scheitere ich an dem Punkt die verfügbaren Netzwerke auf der Weboberfläche auszugeben.


    Beim Aufruf der Seite, wird folgender PHP-Code ausgeführt:

    PHP
    <?php
    shell_exec ('/var/www/html/scripts/wlan.sh');
    $zitate = file_get_contents('wlan.txt');
    echo nl2br($zitate);
    ?>

    das Script sieht "wlan.sh" so aus:

    Code
    iwlist scan &> /var/www/html/scripts/wlan.temp
    grep ESSID /var/www/html/scripts/wlan.temp &> /var/www/html/php/wlan.txt

    Wenn ich das Script selber ausführe (angemeldet als "pi", ohne sudo) funktioniert alles wie es soll: Das Ergebnis der Netzwerksuche wird in "wlan.temp" gespeichert und die jeweiligen Namen der Netzwerke werden in "wlan.txt" ausgegeben. Wenn ich das Script über die Seite mit dem PHP-Code ausführe, wird meine wlan.temp leer geräumt und dementsprechend ist die wlan.txt auch leer.


    Ich dachte erst daran, dass es ein Berechtigungsproblem sei, daher habe ich probehalber allen alle rechte der beiden Textdateien gegeben. Bringt keinen unterschied.


    Im Apache Log ist nach jedem Versuch das zu finden:

    Code
    eth0      Interface doesn't support scanning.
    
    lo        Interface doesn't support scanning.

    Das sind die ersten beiden Zeilen, wenn man den Befehl "iwlist scan" ausführt, ohne das Ergebnis in eine Datei umzuleiten. (Führt man das Script von Hand aus, werden auch diese Zeilen in die Datei umgeleitet). Darunter Kommt dann das ergebnis der WLANsuche, welches mich eigentlich interessiert und welches in "wlan.temp" geschrieben werden soll.


    Hat jemand ne Idee woran das liegen kann? Gibt es vielleicht eine einfachere Variante, das ganze in die Tat umzusetzen? Ich kann ja nicht der erste sein, der sowas in der Art vor hat.


    Meine bisherigen Recherchen haben leider nichts ergeben.


    Wenn ich mich einfach nur Dumm anstelle, lasst es mich wissen. Ich bin bereit neues zu lernen.


    Vielen Dank und viele Grüße,

    Barnibas

  • Hallo und Willkommen im Forum!

    Gewöhne dir an, dass du in Skripten absolute Pfade verwendest - das sollte das Problem sein.

    Danke :)


    Welchen Pfad genau meinst du? Abgesehen von der 3. Zeile im PHP-Code gibt es ja keine relativen Pfade und die Zeile funktioniert, bzw hat nichts mit dem Problem zu tun. Die Wird erst danach ausgeführt

    • Official Post

    Hallo,


    willkommen im Forum!

    Ich dachte erst daran, dass es ein Berechtigungsproblem sei, ...

    Wenn ich raten müsste, dann wird das wohl auch der Grund sein, nur anders als Du dachtest. Der User www-data befindet sich nicht in der Gruppe netdev und hat somit (imho aus gutem Grund) keinen Zugriff auf Netzwerkgeräte. :denker:


    Du wolltest einen Link? Bitteschön: https://wiki.ubuntuusers.de/Benutzer_und_Gruppen/ ;)

  • Code
    iwlist wlan0 scan > /var/www/html/scripts/wlan.temp
    
    grep ESSID /var/www/html/scripts/wlan.temp > /var/www/html/php/wlan.txt

    Angeben welches Interface er nutzen soll zum suchen, eth0 macht da wenig sinn, also Wlan auswählen, meist "wlan0" und mach die & zeichen weg !



    oder so:


    Code
    iwlist wlan0 scan | grep ESSID > /var/www/html/php/wlan.txt
  • Wenn ich raten müsste, dann wird das wohl auch der Grund sein, nur anders als Du dachtest. Der User www-data befindet sich nicht in der Gruppe netdev und hat somit (imho aus gutem Grund) keinen Zugriff auf Netzwerkgeräte. :denker:

    Ich verstehe, was du meinst, aber daran kanns eigentlich auch nicht liegen, denn wie man im errorlog sieht, greift er ja auf die Netzwerkgeräte zu.


    So wie ich die Sache sehe, werden die Netzwerkgeräte ausgelesen, die beiden ersten Schnittstellen (Ethernet und Bluetooth) werden im Errorlog abgelegt und der Rest verschwindet sonst wo, anstatt dass alles davon in die Textdatei umgeleitet wird. Nur sehe ich keinen Grund dafür, dass es nicht passiert.

  • oder so:


    Code
    iwlist wlan0 scan | grep ESSID > /var/www/html/php/wlan.txt

    ich versteh nicht ganz wieso, aber jetzt funktionierts :D danke

    und mach die & zeichen weg !

    Die hatte ich am Anfang nicht und dann wurde mir beim Ausführen des Scripts immer die ersten beiden Schnittstellen ausgegeben und die letzte in die Datei umgeleitet. Dann hab ich etwas rumgegooglet, festgestellt, dass das es mehrere Ausgabekanäle gibt und diese Methode probiert. Dann wurde alles umgeleitet.


    Vermutlich ist das auch der Grund, wieso es nun geht...es wird nur noch eine Schnittstelle ausgegeben, deswegen landet nichts mehr im error.log.


    Danke auf jeden Fall :)