Mit PHP Shellskript ausführen...

derMIKA

New member
Verdammisch,

häng seit zwei Tagen an einem Problem fest, was nicht gelingen will.

Ich muss eine Web-Oberfläche programmieren, die einen Dienst hoch bzw. runter fährt.

Hab ich mir gedacht, kann ja nicht so schwer sein. Hab mir dann zwei Dateien geschrieben:

start.sh said:
#!/bin/bash
sudo -u userx -p geheim /home/userx/dienst/name /home/userx/dienst/name.conf > /dev/null &

stop.sh said:
#!/bin/bash
sudo -u userx -p geheim killall -9 /home/userx/dienst/name

Das klappt in der Konsole wunderbar, die dienste werden unter UserX gestartet und gestoppt.

Jetzt woll ich fix eine PHP - Datei schreiben, die sieht z.Z. so aus:

do.php said:
PHP:
<?php
include('config.inc.php');

if ($_GET['stream_hi'] == 'start') {

$exe="/home/userx/dienst/start.sh";
echo ("Starting...<br>Executing '$exe'");
exec ($exe);
 
}

if ($_GET['stream_hi'] == 'stop') {
  
$exe="/home/userx/dienst/stop.sh";
echo ("Stopping...<br>Executing '$exe'");
system ($exe);

  
}

So, hab dann noch die zwei .sh-Skripte auf den wwwuser gechownt, Safe Mode ist Off (laut phpinfo) und error_reporting(E_ALL); bringt auch keine Meldung...

Hab ich was vergessen...?

Danke & Gruß

Mika
 
Haben die Scripts "x"-Rechte (also ausführbar)?

php.net said:
exec() führt ein gegebenen Befehl aus, ohne eine Ausgabe zu erzeugen. [...] Wenn Sie auf die direkte Rückgabe/ Ausgabe eines Befehls angewiesen sind, dann benutzen Sie stattdessen die Funktion passthru().
 
patrick said:
Haben die Scripts "x"-Rechte (also ausführbar)?

Hi patrick,

danke für Deine Antwort.

Ja, die beiden Skripte haben "x" - Rechte, ich kann die Skripte auch auf der Konsole starten (müssen von daher ausführbar sein).

Grundsätzlich möchte ich ja keine Ausgabe (gibt ja eh nichts zu sehen, sende alles in den Mülleimer). Mit passthru gibts auch keine Meldung, auch keine Fehlermeldung. :(

Ich möchte "nur" das die Skripte ausgeführt werden. Wie debugge ich sowas denn jetzt am besten...?

Gruß Mika
 
Hm... versuchs mal mit Sudo oder mal so:
PHP:
<?php
include('config.inc.php');

if ($_GET['stream_hi'] == 'start') {

$exe="/home/userx/dienst/start.sh";
echo ("Starting...<br>Executing '$exe'");
$process = exec($exe);
echo ("<br>" . $process);

}

if ($_GET['stream_hi'] == 'stop') {
  
$exe="/home/userx/dienst/stop.sh";
echo ("Stopping...<br>Executing '$exe'");
$process = exec($exe);
echo ("<br>" . $process);

  
} 
?>
Dann wissen wir mehr :)
 
So,

ich hab mal weiter probiert und hab auch alle relevaten Dateien vom Dienst ins www - Verzeichnis gepackt um es von da aufzurufen.

Hab dort ohne Sudo den Dienst gestartet, er wurde auch ausgeführt (zumindest kam dort eine Ausgabe in $process), aber sofort wieder beendet (Dienst läuft nicht).

Letzendlich _muss_ der Dienst aber unter einem anderen User laufen, ob jetzt userx oder wwwrun wäre mir noch egal...

Gruß Mika
 
Wenn mich meine Kenntnisse nicht ganz verlassen haben, muss ich das nur machen, wenn ich kein Passwort mitgeben möchte.

Aber mit -p gebe ich das Passwort sehr gerne mit.

Oder MUSS ich den Dienst trotz Passwort mitgeben? Würde ja dann keinen Sinn machen...

Gruß Mika
 
Versuche es mal mit der sudoers, danach ging es bei mir auch ohne Probleme.

Edit:
*lol* 444 Postings, schon wieder eine Schnappszahl *g*
 
mh,

hab jetzt mit visudo folgende Einträge gemacht:

wwwuser ALL=/srv/www/htdocs/web8/html/scsa/dienst/start.sh
wwwuser ALL=/srv/www/htdocs/web8/html/scsa/dienst/stop.sh

funzt nicht.

Bin aber auch nicht sicher, ob meine Einträge so stimmen.

//Edit:

mh, ich bekomme eine PID zurück, nur wird diese offensichtlich direkt wieder gestoppt :(

Scheiße, kann doch nicht so kompliziert sein....

Gruß Mika
 
Last edited:
Hm... vielleicht beendet PHP den Prozess wieder, wenn du die Seite verlässt (bzw. die Seite fertig geladen wurde). :baby:
 
Ja, so wird es sein, ich sehe den Dienst ganz kurz und dann ist er weg.

Nur, wie behebe ich sowas...?

Gruß Mika
 
Back
Top