Her0ni: html/php: button, der eine Datei ausführen lässt

Hey liebes Forum,

es geht um folgendes, im Grunde sehr simplen Problems, dessen Lösung mir bisher jedoch offensichtlich verwehrt blieb: Ich möchte einen Button auf meinem Webserver einrichten, der bei Drücken auslöst, dass eine PHP-Datei ausgeführt wird, die wiederum ein Python-Script öffnet. Die Einzelkomponenten funktionieren alle, doch zusammen führt es nicht zu gewünschtem Ergebnis. Ich brauche also Hilfe.

Das hier ist das Script des Webservers:

<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>PictureFrame</title>

</head>
       <body>
       
       <center>
       <h1>PictureFrame </h1>
       
       <a href="./pi3d.php"><img src="./Pi3d.png"></a>
	               
       </center>

       </body>
</html>

Und das ist das pi3d.php Script:

<?php

shell_exec('/home/pi/start_pi3d.sh');

header("Location:index.php");

?>

Lasse ich das pi3d.php Sript manuell laufen, klappt es, klicke ich aber auf den Button auf der Internetseite funktioniert es nicht, obwohl angezeigt unten links angezeigt wird, dass der Button zur pi3d.php Datei führt.

Freue mich über jeden Denkanstoss :)

  1. Hallo Her0ni,

    dein Posting ist nicht sehr hilfreich. Seit Cheatah unsere beste Glaskugel zerdeppert hat... und die übrigen trüb sind, brauchen wir konkreteren Input.

    Lasse ich das pi3d.php Sript manuell laufen

    Und das heißt was? Rufst Du die URL durch Handeingabe in der Browser-Adresszeile auf?

    klicke ich aber auf den Button auf der Internetseite funktioniert es nicht

    "Funktioniert nicht" funktioniert nicht als Fehlerbeschreibung. Was erwartest Du, und was passiert statt dessen? Erscheint Fehlertext im Browser? Schau in die Entwicklerwerkzeuge des Browsers, was steht im Netzwerk-Tab? Kommt ein HTTP Fehlercode, kommt falscher Inhalt? Steht etwas im Error-Log des Webservers?

    Hast Du Fehleranzeigen grundsätzlich abgeschaltet? Was steht diesbezüglich in deiner PHP.INI (Stichwort: display_errors)?

    Du könntest zu Beginn deines PHP Scripts einmal einfügen:

    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    

    Werden dann Fehlermeldungen im Browser sichtbar?

    Wenn manueller Aufruf bedeutet, dass Du das pi3d-Script auf der Kommandozeile deines Webservers (also des Computers) erfolgreich aufrufen kannst, dann wäre zu prüfen, mit welchen Rechten dein Webserver (diesmal: der HTTP Dienst. Apache, Tomcat, nginx, oderweißdergeierwas) unterwegs ist.

    Der Webserver-Dienst läuft typischerweise unter einer technischen User-ID, nicht mit deinem interaktiven User. Und dann kommt er vielleicht gar nicht an /home/pi/start_pi3d.sh heran. Oder er kommt nicht an den Python-Interpreter heran. Oder das Script tut Dinge, die es mit den Rechten des Webserver-Dienstes nicht durchführen kann. Da gibt's viele Möglichkeiten, wofür Rechte fehlen können.

    Auf Stackoverflow habe ich eine Diskussion dazu gefunden.

    Im Übrigen hätte ich ein paar Haare zu spalten...

    Das hier ist das Script des Webservers:
    (...)

    Nein, das ist kein Script. Das ist eine statische HTML Seite.

    Und das ist das pi3d.php Script:

    Ja, das ist ein Script.

    Hinweis, unabhängig vom Thema: Gewöhne Dir an, ein PHP Script nicht auf ?> enden zu lassen. Grund: Man hat gerne mal hinter dem ?> ein Leerzeichen oder einen Zeilenumbruch übersehen, und dieses Whitespace kann einem, je nach dem Umständen, das Layout verhageln. Wenn das PHP Script per include eingebunden wird, kann es sogar die Funktion der Seite empfindlich stören, weil die erste Textausgabe dazu führt, dass PHP die Header sendet.

    Ich möchte einen Button

    <a> ist kein Button, sondern ein Link. Aber das <a> Element ist für deinen Zweck schon die richtige Idee.

    Rolf

    --
    sumpsi - posui - obstruxi
  2. Fragt sich, wie Du darauf kommst, dass das nicht funktioniert…

    shell_exec('/home/pi/start_pi3d.sh');
    

    Das Handbuch sagt, shell_exec gibt die Ausgaben des Befehls zurück - nicht aber aus

    echo shell_exec('/home/pi/start_pi3d.sh');
    
    $foo=shell_exec('/home/pi/start_pi3d.sh');
    echo $foo;
    

    Aber vielleicht reicht das nicht. Hab nämlich grad die Kugel poliert:

    Ein

    chmod a+rx /home/pi/start_pi3d.sh
    

    oder, besser:

    chgrp www-data /home/pi/start_pi3d.sh
    chmod g+rx /home/pi/start_pi3d.sh
    

    im Terminal könnte helfen. Denn just zum Thema „Rechte“ hast Du nichts „gesagt“.

    1. Nachleuchten der Glaskugel:

      Auch Deine Fehlerbehandlung ist mangelhaft. Ich zeig Dir das mal exemplarisch:

      error_reporting(E_ALL);
      ini_set( 'display_errors', 1 );
      
      $errorLog = tempnam();
      echo shell_exec( '/home/pi/start_pi3d.sh 2>'.$errorLog );
      
      if ( $err = file_get_contents( $errorLog ) ) {
         trigger_error( $err, E_USER_ERROR );
      }
      

      Dabei könnte sich übrigens herausstellen, dass Du Dein Skript richtig testen, also mit dem erwarteten User ausführen musst. In der Shell:

      sudo −s
      sudo -u www-data /home/pi/start_pi3d.sh
      

      Nochwas: Brauchst Du eine Anleitung, wie man den Benutzer pi los wird?

      Ein neuer Benutzer ist schnell angelegt und dann mit

      sudo usermod -aG sudo TollerHecht 
      

      in die Lage versetzt, sudo auzführen (Debian, Raspian, e.t.c.)

      Dann kann der pi weg.

      1. Hallo,

        sudo −s
        sudo -u www-data /home/pi/start_pi3d.sh
        

        willst du diese beiden Anweisungen nicht zusammenfassen? Ein sudo -s ohne Angabe des gewünschten Users erscheint mir sinnlos.

        Nochwas: Brauchst Du eine Anleitung, wie man den Benutzer pi los wird?

        Ich habe auf meinen Himbeeren gar nicht versucht, ihn loszuwerden. Mir genügte es, ihn (mitsamt seinem Home-Verzeichnis) umzubenennen. Und natürlich, ihm ein sauberes Passwort zu geben.

        Live long and pros healthy,
         Martin

        --
        Home is where my beer is.
        1. Hallo,

          Tach.

          sudo −s
          sudo -u www-data /home/pi/start_pi3d.sh
          

          willst du diese beiden Anweisungen nicht zusammenfassen?

          Nö. Her0ni muss erst mal antworten befor ich weiteres Engagement zeige ;-)