Shelldatei via PHP starten will nicht klappen...

  • Hallo, ich bin jetzt seid ein paar Wochen Besitzer eines Rasperry Pi 3.

    Habe vor, einige Relais und Funksteckdosen via Weboberfläche anzusteuern...

    Relais funktionieren wunderbar. Nur die Funksteckdosen wollen noch nicht richtig.

    Habe im Verzeichnis:

    /root die Datei 10.sh liegen. Wenn ich diese ausführe schaltet die Steckdose wunderbar.

    ( Inhalt der Datei: sudo raspberry-remote/send 11111 1 0)

    Im Verzeichnis:

    /var/www/html/

    liegt die datei

    fu 10.php mit der ich jetzt die 10.sh ausführen möchte.

    Inhalt der Datei:

    <?php
    shell_exec ("/root/10.sh");
    header("Location:index.html");
    ?>


    Problem liegt jetzt darin, das die 10.sh von hier aus nicht ausgeführt wird und ich nicht weis wie ich es hinbekommen kann.
    wenn ich http://192.xxx.xxx.xx/10.php starte, werde ich auch auf die Index weiter geleitet. Von daher würde ich schon davon ausgehen das die 10.php glesen wird.

    Wenn mir jemand dabei Helfen könnte, wäre ich euch mega Dankbar.... :danke_ATDE:


    MFG Silvio

  • Das kann viele Gründe haben. Schau doch mal in die Logs Deines Webservers. Welchen verwendest Du denn?

    Meine Vermutung wäre ein Rechteproblem: Der Webserver läuft vermutlich unter dem Nutzer www-data und der darf auf das Verzeichnis /root vermutlich nicht zugreifen. Poste doch mal den output von "sudo ls -la /root". Lösung wäre, das Skript (10.sh) an eine andere Stelle zu verschieben und für www-data ausführbar zu machen.

    Eventuell musst Du www-data auch noch die sudo-Rechte für raspberry-remote/send geben - und dieses mit komplettem Pfad aufrufen, also "sudo /root/raspberry-remote send ...".

  • FAQ => Nützliche Links / Linksammlung => [PHP] Anleitung zum schalten von GPIO => Einführung
    (auch wenn du kein GPIO schalten willst!)

    FAQ => Nützliche Links / Linksammlung => Befehle über PHP mit root Rechten ausführen (sudo webscript)


    Ein Webserver läuft i.d.R. über einen bestimmten Benutzer: www-data
    Dieser Benutzer hat Standardmäßig keine Rechte die Hardware zu beeinflussen. Auch haben normale Benutzer allgemein kein Recht auf andere Benutzerverzeichnisse zuzugreifen.
    Generell ist es so das normale Benutzer nicht auf die Verzeichnisse anderer Benutzer zugreifen dürfen - das wäre unsicher und uncool. Der www-data Benutzer sieht also nicht die Dateien in /root/ da er darauf nicht zugreifen kann.

  • Hallo,

    komme leider immer nur sporadisch dazu was zu machen....

    hier mal die: sudo ls -la /root

    Der log vom Apache 2 zeigt keine Fehler an.
    Gibt es noch einen allgemeinen Log wo alle vorgänge gespeichert werden? habe jetzt nur den Error.log gefunden. Und der zeigt mir keine Aktuellen Fehler an...

    Wäre es jetzt möglich das [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]www-data die Rechte für Root bekommt? Und nein, das Ding soll nicht an Inet, von daher auch keine Probleme mit der Sicherheit.[/font]

    Um diesen Teil werde ich mich noch bemühen: [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]FAQ[/font][font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"] => [/font][font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Nützliche Links / Linksammlung[/font][font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"] => [/font][font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Befehle über PHP mit root Rechten ausführen (sudo webscript)[/font]

  • Das sieht zumindest aus, als hätte www-data die nötigen Rechte für Dein Shellskript. Aber wo steht denn nun raspberry-remote/send (sorry, hatte nicht runtergescrollt), wie sieht es da mit den Rechten aus (ls -l raspberry-remote/send) und hast Du mal versucht, es in Deinem Skript mit vollem Pfad aufzurufen, wie ich das oben vorgeschlagen habe?
    Automatisch zusammengefügt:

    Und hat www-data die benötigten sudo-Rechte?

    Einmal editiert, zuletzt von Manul (27. Juni 2016 um 18:24)

  • Es ist sehr ungewöhnlich Dateien in /root/ so einzustellen das Jeder Alle Zugriffsrechte darauf hat - wenn es nicht sogar leichtsinnig ist.

    Tu dir selbst einen Gefallen und sorge nicht für Chaos auf deinem Pi. Lege die Dateien die vom Webserver ausführbar sein sollen innerhalb des Benutzerverzeichnisses von www-data ab, sprich: /var/www/

    Desweiteren solltest du besagten Link aufmerksam durchlesen, insbesondere den Teil über shell_exec, sowie worüber der ganze Beitrag eigentlich handelt: Befehle über PHP mit root Rechten ausführen

    Und zu guter letzt sei gesagt das man ziemlich oft auf Sachen wie exec(); verzichten und das direkt/nativ über PHP abwickeln kann. Wenn es denn doch nicht anders geht, dann zumindest nur über eine einzige *.sh Datei

  • Hallo ihr beiden, danke nochmal für die Hilfe.

    Ich gebe recht, das das mit den Rechten so nicht wirklich sauber gelöst ist. Ich muss aber auch dazu sagen, das ich ja gerade im lernen bin, den Pi 2 Wochen besitze und mir die Grundlagen des verständisses an einigen Ecken noch erlerne. :D
    Wenn ich weiter voran geschritten bin und dann mit PHP und Shell weiter bin, werde ich sicherlich einiges anders machen.... :D

    Ich habe jetzt mal ein wenig gespielt, die Shell datei liegt jetzt mit im Ordner /var/www/html/10.sh
    Wenn ich diese hier ausführe, funktioniert auch der Sendebefehl
    und sieht so aus:

    Code
    sudo /root/raspberry-remote/send 11111 1 0


    wo es jetzt noch hapert, ist die php zum ausführen der Shell:

    PHP
    <?php
    exec("/var/www/html/10.sh");
    header ("Location:index.html");
    ?>

    Was funktioniert, das ich auf die Index.html geleitet werde, die Funksteckdose aber nicht bedient wird....? Könnt ihr mir da bei dem Code helfen???? :angel:

    Die PHP liegt auch in dem gleichen Verzeichnis.

  • Ich ersuche dich erneut das du den verlinkten Beitrag noch mal liest :fies: Diesmal bis ans Ende, und die Fehlerbehandlung ausprobierst.

    Du hast jetzt zwar die Sache mit den Zugriffsrechten evtl. gelöst, aber noch immer nicht verstanden was "sudo" ist oder dafür nötig ist.


    Wenn im 10.sh Script nur "sudo /root/raspberry-remote/send 11111 1 0" drin steht dann ist die Datei überflüssig und kann direkt im PHP ausgeführt werden, diese eine Zeile.
    header ("Location:index.html"); wäre ebenfalls überflüssig wenn du denn einfach index.html in index.php umbenennst und die Behandlung direkt dort drin abhandelst. Siehe dazu FAQ => Nützliche Links / Linksammlung => PHP: Anleitung zum schalten von GPIO => Grundlage (auch wenn du keine GPIO schalten willst!)

  • Diese Rechte bedeuten, daß jeder die Datei ausführen kann. Das heißt aber nicht, daß jeder sie auch als root per sudo ausführen kann. Dazu musst Du mittels des Befehls 'visudo' einen Eintrag für den Nutzer www-data in /etc/sudoers erstellen, der eben dies erlaubt.

  • Bin jetzt leider vom pi weg.
    Ich hatte die Überlegung, das ich auch einen Master -aus habe und vielleicht auch Gruppen schalten möchte.
    Wenn ich da für jeden ein und aus Befehl ein eigenes Shell habe kann ich die wie ich lustig bin ja in die PHP legen.
    Dies klappt mit den gpio auch ganz gut und ich kann wenn ich will in der Shell ja auch Zeitbefehle mit einlegen, wie lange etwas an bleiben soll. Auch fand ich es schön, das ich so auch was einzeln ändern kann.
    Ich lasse mich da auch gern belehren wenn ihr sagt das dfunktioniert auch via PHP. Doch als noch Anfänger, der ich halt nun mal bin, kann ich ja nicht gleich alles auf einmal erlernen.
    Ich hoffe ihr haut mich jetzt nicht. :D
    Ich bin gern lernfähig und will das auch erlernen.

    Mfg Silvio

  • Ich würde nicht zehntausend Dateien anlegen. Wenn du in jeder einzelnen *.sh Datei nur eine einzige Zeile hast - und selbst wenn es mehrere sind - kannst du das alles in nur einer *.sh zusammenfassen und mit unterschiedlichen Argumenten aufrufen.

    Aber bevor ich dazu mehr texte wärs gut zu wissen wie deine index.html aussieht und was genau du eigentlich erreichen willst

  • hier mal noch die Index.html

    HTML
    <!DOCTYPE html> <html class="no-js responsivelayout" lang="de"> <head> <title>Silvio Home</title> <meta name="robots" content="index, follow"> <meta name="keywords" content=""> <meta name="description" content=""> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width"> <meta name="generator" content="Zeta Producer 13.1.0.0, ZP13F, 10.03.2016 09:08:20"> <link rel="shortcut icon" type="image/x-icon" href="assets/icon.ico"> <link rel="stylesheet" type="text/css" href="assets/bundle.css?v=635922708820000000"> <link rel="stylesheet" type="text/css" href="assets/bundle-print.css?v=635922708600000000" media="print"> <!--[if IE 7]><link rel="stylesheet" type="text/css" href="assets/styles-ie7.css" media="screen"><![endif]--> <!--[if lte IE 8]><link rel="stylesheet" type="text/css" href="assets/styles-ie8.css" media="screen"><![endif]--> <script>
    document.documentElement.className = document.documentElement.className.replace(/no-js/g, 'js');
    </script> <script type="text/javascript" src="assets/bundle.js?v=635922708820000000"></script> </head> <body id="simple-responsive"> <a id="top"></a> <div id="wrapper"> <div id="framebox"> <div id="topline"> <div class="clearx"></div> </div> <div id="navbar"><ul class="mainmenu"> <li class="topmenuactive"><a href="index.html">Silvio Home</a></li> <li><a href="schreibtischlampe.html">Schreibtischlampe</a></li> <li><a href="pflanzenecke.html">Pflanzenecke</a></li> <li><a href="impressum.html">TV Rack</a></li> <li><a href="fensterbeleuchtung.html">Fensterbeleuchtung</a></li> <li><a href="kontakt.html">LED</a></li> <li><a href="alles-aus.html">Alles AUS</a></li> </ul><div class="clearfix"></div></div> <div id="contentbox" class="nosidebar"> <div id="floatcontentright"> <div class="zparea zpgrid" data-numcolumns="" data-areaname="Standard"> <div class="zpRow standard "> <div class="zpColumn zpColumnWidth1 c12" style=" "> <div class="zpColumnItem"> <div id="a1349" data-articleid="1349" class="articlearea zpwBild"> <img class="singleImage" src="media/images/backround.jpg" width="890" height="501" alt=""> </div> </div> </div> </div> </div> <div class="clearx"></div> </div> <div id="sidebarleft"> <div class="zparea " data-numcolumns="12" data-areaname="News"> </div> </div> <div class="clearx"></div> </div> <div id="footer"> <div id="footerinfo"> <a href="http://www.zeta-producer.com" class="zp">Website erstellt mit Zeta Producer CMS</a> </div> <div style="clear:left"></div> </div> </div> </div> </body> </html>

    Den rest schaue ich mir morgen mal an. ;D

  • Oh gott, das ist ja ne mittelschwere Katastrophe :( Also nicht nur das alles in fast nur einer Zeile steht, sondern auch das du schreibtischlampe.html usw hast, und darin dann vermutlich eine php aufrufst die wiederum den Befehl absetzt? :-/

    Geordneter sähe dein Code so aus => http://codepad.org/mXnvysfq

    Aber wie gesagt: unnötig alles in winzige Dateien aufzustückeln. Evtl. würde das auch der Übersicht dienlich sein und somit helfen mögliche Probleme schneller zu finden ;)

    Benenne die index.html erst mal in index.php um und ließ dir besagte Links durch, dann sehen wir weiter :)

  • Ich dachte mir schon das du so was sagst. =(

    Die Seiten sind alles eigenständige Seiten.
    Auf jeder Seite sind derzeit 2 Schalter. Einer für gerät an. Und einer für gerät aus.
    Das ist ja alles auch nur Spielerei bis jetzt. Ich will ja erstmal ein paar Grundlagen begreifen. Wenn ich das dann mal drin habe mache ich das sicherlich schöner und einfacher. Erstmal muss ich ja aber von klein anfangen. Kann gerne heute nachmittag ein paar Screenshots von der Seite machen.
    Das du dir das vorstellen kannst.
    Und ehrlich gesagt bin ich froh wenn mit meinem jetzigen wissensstand überhaupt etwas schaltet am PI.

    MFG Silvio.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!