Hallo Zusammen,
ist es möglich ein Script auf dem Pi via PHP auszuführen?
- das PHP-Script läuft auf einem Server im LAN (Xampp).
- der Pi hat eine feste IP-Adresse
- Das Script auf dem Pi ist im Root-Verzeichnis und heist "refresh.sh"
Grüße
Schmakus
Hallo Zusammen,
ist es möglich ein Script auf dem Pi via PHP auszuführen?
Grüße
Schmakus
Script per PHP von Localhost ausführen? Schau mal ob du hier fündig wirst!
ja geht, ist aber ziemlich bööse, besser wäre, wenn du eine Website aufrufst, die dann über PHP das script aufruft
FAQ --> Nützliche Links / Linksammlung --> Befehle über PHP mit root Rechten ausführen (sudo webscript)
ja geht, ist aber ziemlich bööse, besser wäre, wenn du eine Website aufrufst, die dann über PHP das script aufruft
Und wie?
exec('sh //192.168.1.100/refresh.sh'); ???
nein, mit z.B. curl rufst du "http(s)://192.168.1.100/triggerRefresh.php" auf und darin steht dann <?php exec("refresh.sh");?>
Damit nutzt du keine Verbindung zum Raspberry die eine Anmeldung erfordert, das ist ein riesiger Sicherheitsgewinn in diesem Kontext und die wesentlich schönere Lösung.
nein, mit z.B. curl rufst du "http(s)://192.168.1.100/triggerRefresh.php" auf und darin steht dann <?php exec("refresh.sh");?>
Damit nutzt du keine Verbindung zum Raspberry die eine Anmeldung erfordert, das ist ein riesiger Sicherheitsgewinn in diesem Kontext und die wesentlich schönere Lösung.
Hi,
habe nun Lighttpd inkl. PHP5 installiert.
dann folgendes erledigt:
Das Shellscript "refresh.sh" liegt im root Verzeichnis und hat folgenden Inhalt:
Das PHP Script liegt in /var/www/html/refresh.php und hat folgenden Inhalt:
Wenn ich nun das PHP Script über die Konsole wie folgt ausführe, wird die aktuelle Website im Iceweasel neu geladen:
Wenn ich aber via externen Browser das Script aufrufe, bekomme ich zwar das ECHO aber die Website auf dem Raspberry wird nicht neu geladen.
Wieso???
Fangen wir vorne an:
* Den Eintrag aus der sudoers wieder raus, der ist maximal böse.
* Das Shellscript raus aus dem root-Verzeichnis. Da gehört NICHTS rein als die vorhandenen Ordner, leg das entweder in /home/pi/ oder in /var/www/html/ (oder Tiefer innerhalb dieser Ordner). Also entweder in den Benutzerordner oder direkt zu dem Rest des Systems (also in diesem Fall dem PHP-Script), nicht einfach irgendwohin.
* Mache mal etwas einfaches in dem script (z.B. 'echo "test" > test.txt') und gucke ob das ganze generell funktioniert
* Funktioniert das refresh wenn du es direkt aufrufst?
* Verwende NICHT shell_exec, wie kommst du darauf? Verwende exec wie ich geschrieben habe, denn das verrät dir auf Wunsch auch, was nciht funktioniert:
Und wer lesen kann ist klar im Vorteil (geht an mich selbst).
Wenn die "website" von der Konsole aus aufgerufen funktioniert, dann ist das ein Rechteproblem. Aber mir ist im ersten Moment nicht klar welches. Daher wäre der output sehr interessant. Da steht dann drinn, welcher Schritt nicht erlaubt war.
Also, mein PHP sieht wie folgt aus:
<?php
exec("sh /var/www/refresh.sh", $output, $return_var);
# Error/Output Handling
if (isset($return_var) AND $return_var >= 1) {
echo "<font face='Arial, Helvetica, sans-serif' size='3' color='FF0000'>ERROR: $
echo "<font face='Arial, Helvetica, sans-serif' size='3' color='009900'>".exitc$
}
if (isset($output) AND !empty($output)) {
foreach($output AS $line) { echo $line."<br/>\n"; }
}
// Function to handle $return_var (exit codes)
/*
An exit status of zero indicates success. A non-zero exit status indicates failu$
When a command terminates on a fatal signal N, bash uses the value of 128+N as t$
If a command is not found, the child process created to execute it returns a st$
mand is found but is not executable, the return status is 126.
If a command fails because of an error during expansion or redirection, the exit$
zero.
Shell builtin commands return a status of 0 (true) if successful, and non-z$
occurs while they execute. All builtins return an exit status of 2 to indicate $
Bash itself returns the exit status of the last command executed, unless a syn$
which case it exits with a non-zero value.
source: http://tldp.org/LDP/abs/html/exitcodes.html
*/
function exitcode($code) {
$ReturnCode['0'] = "Successful";
$ReturnCode['1'] = "General Error (Miscellaneous errors, such as 'divide by zer$
$ReturnCode['2'] = "Incorrect Usage";
$ReturnCode['126'] = "Command found but not executable (Permission problem)";
$ReturnCode['127'] = "Command not found (Possible problem with PATH or a typo)";
$ReturnCode['128'] = "Invalid argument to exit (exit takes only integer args in$
$ReturnCode['130'] = "Script terminated by Control-C";
return $ReturnCode[$code];
}
?>[/php]
Mein Script "refresh.sh" sieht wie folgt aus:
[code]export DISPLAY=:"0.0"
XAUTHORITY=../../home/pi/.Xauthority
xdotool getactivewindow
xdotool key F5
Alles anzeigen
Wenn ich nun das Script wie folgt aufrufe, funktioniert der Reload:
Wenn ich über den Browser "http://raspi/refresh.php" aufrufe kommt folgende Meldung:
Zitat[color=FF0000][font="Arial, Helvetica, sans-serif"]ERROR: [/font][/color][color=009900][font="Arial, Helvetica, sans-serif"]General Error (Miscellaneous errors, such as 'divide by zero' and other impermissible operations)[/font][/color]
Wenn ich in die Error-Log von Apache schaue, sehe ich folgenden Eintrag:
Das ist der Selbe Fehler, wie wenn ich mit der Konsole das PHP-Script mit "sudo" ausführe (ohne SUDO gehts?!)
Das macht Sinn.
Du willst vom aktuellen Benutzer die Einstellungen laden, mit sudo (also als root) sind die Einstellungen natürlich roots Einstellungen, per Website sind das die Einstellungen von www-data.
In dem Moment wo das xdotool losgeht hört meine Ahnung leider auf, könnte da jemand anders einspringen? bis dahin scheint es zu funktionieren.
Kleine Anmerkung:
XAUTHORITY=../../home/pi/.Xauthority
das brauchst du nciht anzupassen.
XAUTHORITY=/home/pi/.Xauthority
reicht aus. / am Anfang eines Pfades bezieht sich immer auf das Wurzelverzeichnis (/)
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!