• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Ausführen von Befehlen per PHP

Stiller

Newbie
Hi!

Erstmal etwas über den Urschleim:
Hab mit nem Kumpel mir einen Server zusammengebastelt und nun soll der natürlich etwas ferngesteuert werden.

Also! Ich möchte gern so ein Webinterface basteln, womit ich den Server ausschalten kann und das WLAN aktivieren kann. Für letzteres liegt auch ein Script bereit, welches nur aufgerufen werden muss.
Nun meine Frage: Wie führe ich die Befehle aus? Weil für beides brauch ich Adminrechte, was ich lokal am PC immer per su erledigt habe.
php.net hat mir folgende Lösungsmöglichkeit gegeben:
Code:
<?php
$output = shell_exec('BEFEHL');
echo "<pre>$output</pre>";
?>
Aber da der Befehl halt ohne Adminrechte ausgeführt wird, gehts nich....leider. Also das ist denke mal die Fehlerstelle.
Habe mich nun auch schon etwas mit den sudo beschäftigt, aber anscheinend bin ich mal wieder zu doof oder steh auf dem Schlauch der Logik um da die Problematik genau einzutragen.

Doch wie ich Linux kenne, gibt es bestimmt noch eine andere Lösung für das Problem!
Darum frage ich euch, wie ich das am dümmsten lösen kann! Bin ja noch sehr unerfahren, was Linux und all das angeht, aber Lerning by Doing ist in dem Fall das beste, denke ich.
 

drcux

Hacker
Ich würde es lieber über einen cronjob erledigen, der alle zwei Minuten die Existenz bestimmter Dateien prüft:

if [ -e /srv/www/htdocs/runscript ]
then tue etwas und lösche datei wieder
fi

Damit braucht dann dein php-Skipt nur die Datei erstellen und du musst dir keine Sorgen machen, das ein Angreifer dein Skript missbraucht um vielleicht andere Befehle mit Rootrechten auszuführen.
 
OP
Stiller

Stiller

Newbie
Soweit ich das gelesen hab, kann man ja über sudo auch nur bestimmte Befehle ausführen lassen.

Das Problem mit den cronjob ist, dass ich erstens einen Task mehr hab und der dann irgendwann in 2 Minuten ausgeführt wird und nicht direkt bei Eingabe.
 

panamajo

Guru
Stiller schrieb:
Also! Ich möchte gern so ein Webinterface basteln, womit ich den Server ausschalten kann und das WLAN aktivieren kann. Für letzteres liegt auch ein Script bereit, welches nur aufgerufen werden muss.
Nun meine Frage: Wie führe ich die Befehle aus? Weil für beides brauch ich Adminrechte, was ich lokal am PC immer per su erledigt habe.
Teile und Herrsche!

Trenne die Geschichte in 2 unabhängige Teile, und zwar dort wo der Übergang der Rechte vom Webserver zum Administrator erforderlich ist. D.h. das PHP Skript implementiert das Webinterface. Aktionen die z.B. root Rechte benötigen werden in eine Datei gespeichert, wohldefinierter Ort und Inhalt.

Für das Ausführen ist dann ein root cronjob zuständig der die Datei einliest wenn vorhanden und den Inhalt entsprechend interpretiert. Ob der cronjob Teil in PHP oder bash oder sonstwas geschrieben wird ist deine Wahl.
 
OP
Stiller

Stiller

Newbie
Naja...klingt auch gut, kommt aber dem von drcux sehr ähnlich, wo dann die genannten Probleme auftreten!

Stiller schrieb:
Das Problem mit den cronjob ist, dass ich erstens einen Task mehr hab und der dann irgendwann in 2 Minuten ausgeführt wird und nicht direkt bei Eingabe.
 
OP
Stiller

Stiller

Newbie
Ich habs jetzt gerade nochmal mit dem sudo versucht...diesmal kam sogar keine fehlermeldung, doch leider funktioniert das bis jetzt noch nicht so, wie gewollt. Die Frage ist jetzt nur, ist der ausführende User der eingeloggte, Apache oder sonst was!?
 

panamajo

Guru
Stiller schrieb:
Das Problem mit den cronjob ist, dass ich erstens einen Task mehr hab und der dann irgendwann in 2 Minuten ausgeführt wird und nicht direkt bei Eingabe.
Wen juckt der eine Prozess mehr?
Die zeitl. Auflösung von cronjobs beträgt 1 Minute.

Stiller schrieb:
Die Frage ist jetzt nur, ist der ausführende User der eingeloggte, Apache oder sonst was!?
Wenn PHP wie üblich als Apache Modul läuft dann läuft der PHP Prozess als Apache Daemon User (openSUSE: wwwrun.www). Dieser User kann sudo AFAIK gar nicht verwenden da kein login Account.
 
OP
Stiller

Stiller

Newbie
Hmmm....aber um ehrlich zu sein: Ich mag nich immer eine Minute warten, bis das dann mal geschieht!

ne Funktion im Webmin gestößen, welche ebenfalls einen Systemneustart oder einen Shutdown anordnen kann. Hab aber vorhin nich getestet, da ich gerade nen Backup gemacht hab auf dem Server...wenn das da funktioniert, könnte man ja auch versuchen die Variante einfach zu entnehmen, oder?

EDIT: Das wäre in Webmin die shutdown.cgi mit folgendem Inhalt.
Code:
#!/usr/bin/perl
# shutdown.cgi
# Shutdown the system immediately..

require './init-lib.pl';
&ReadParse();
$access{'shutdown'} || &error($text{'shutdown_ecannot'});
&ui_print_header(undef, $text{'shutdown_title'}, "");
print "<p>\n";
$ttcmd = "<tt>$config{'shutdown_command'}</tt>";
if ($in{'confirm'}) {
	print "<font size=+1>",&text('shutdown_exec', $ttcmd),"</font><p>\n";
	&shutdown_system();
	&webmin_log("shutdown");
	}
else {
	print "<font size=+1>",&text('shutdown_rusure', $ttcmd),"</font>\n";
	print "<center><form action=shutdown.cgi>\n";
	print "<input type=submit value=\"$text{'shutdown_ok'}\" ",
	      "name=confirm>\n";
	print "</form></center>\n";
	}
&ui_print_footer("", $text{'index_return'});

Da diese Datei eingebunden wird, um das System runterzufahren, müsste ich ja eigentlich die Webseite nur auf diesen Link weiterleiten lassen mit den gleichen Parametern wie im Originalinterface! Der Rest dürfte reine Spielerei sein....wer mir wiedersprechen mag, darf das gern! ;)
 
Oben