Webinterface für Gameserver/Shellscript wird nicht ausgeführt

D

dj_mytze

Schnuffi
Guten Abend,
ich weis die Uhrzeit ist unmenschlich, aber ich sitz jetzt seit 4h dran und komm auf keine Lösung.
Problem ist folgendes:
Habe mehrere Gameserver und möchte selbige per Webinterface steuern(Start, Stop, Neustart). Zum starten der Server habe ich mir Scripte erstellt, die sich per Shell auch prima ausführen lassen. Allerdings möchte ich nicht mehreren Clan-Membern Shell-Zugriff gewähren bzw gehts auch ein wenig um den Komfort :P

Also kurz gefasst:
Die Server sollen sich per WI steuern lassen, lassen sie sich aber nicht :D

Aktuelles Script(für einen Server):
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>[P.S.S.]Gameserver Webinterface</title>
</head>

<body>
</body>
</html>

<?php
$act = $HTTP_GET_VARS['act'];
$output = shell_exec("./fear-start status");

//  Server starten
if ($act=="start")
{
  $output = shell_exec("./fear-start start");
  sleep (3);
  echo"<p><b>$output</b>  <font color='#FF0000'>Server gestartet</font></p>";
}

//   Server neustarten
elseif ($act=="restart")
{
  $output = shell_exec("./fear-start restart");
  sleep (3);
  echo"<p><b>$output</b>  <font color='#FF0000'>Server neu gestartet</font></p>";
}
//   Server stoppen
elseif ($act=="stop")
{
  $output = shell_exec("./fear-start stop");
  sleep (3);
  echo"<p><b>$output</b>  <font color='#FF0000'>Server gestoppt</font></p>";
}
?>
<table border="0" width="80%">
<tr>
    <td colspan="2"><h2 align="center">Serverstatus</h2></td>
</tr>
<tr>
    <td colspan="2" align="center">
        <table border="1">
        <tr>
            <td bgcolor="#666666" align="center"><b><?php echo $output; ?></td>
        </tr>
        </table>
    </td>
</tr>
<tr>
    <td align="center" colspan="2">
    <h2>Script ausführen</h2>
    <p>Optionen<br />
    </p>
        </td>
</tr>
<tr>
    <td width="33%" align="right"><p><a href="index.php?act=start">Server starten</a> :</td>
    <td width="33%"><a href="index.php?act=stop">Server stoppen</a></td>
    <td width="33%"><a href="index.php?act=restart">Server neustarten</a></td>
</tr>
</table>
Es fängt damit an, dass der Serverstatus nicht stimmt, was mir soviel sagt, wie dass das Script nicht funktioniert.
Die wirklich gute Frage ist jetzt: Warum?

Infos:
Das php-Script liegt in einem Verzeichnis meiner Site (/.../.../pss-gaming/wi/index.php)
Das Script zum Server steuern liegt im Verzeichnis der Gameserver(/.../.../gameservers/fear-start/

den Verweis auf das Script habe ich per Verknüpfung gelöst

Der Apache2 und die GS laufen natürlich unter unterschiedlichen Usern

Das Verzeichnis für das WI habe ich per htaccess abgesichert

OS meines Roots ist Debian 4 mit Kernel 2.6.18-6

Stundenlanges Googeln etc hat mir nicht geholfen, jemand da ne Idee?
 
Zuletzt bearbeitet:
Htaccess hat keine Bedeutung für den Script, ich nehme eher an das es an den Usern liegt. Guck mal ob der Apache User überhaupt Rechte hat den Script auszuführen, bzw. ihn als anderen User auszuführen.
Der Apache user hat per default sehr eingeschränkte Rechte, auf manchen Distris ist dieser sogar nobody. Da kann der nicht einfach einen Script als andere User ausführen.
Und das wichtigste was du vergessen hast ist der Startscript (Fehlerquelle Nummer 1), vermutlich leigt da der Hund begraben.
 
Und das wichtigste was du vergessen hast ist der Startscript (Fehlerquelle Nummer 1), vermutlich leigt da der Hund begraben.

hmm, in der shell als Besitzer ausgeführt funzt es aber....
Code:
#! /bin/bash

NAME=fearpublic
DESC="fear - public"
PARAMS=""
DIR=/var/www/gameservers/fear_public/

SCRIPT=start.sh

DAEMON=$DIR/$SCRIPT

case "$1" in
start)
echo "Starte $DESC: $NAME"
cd $DIR
killall fear-server.bin
screen -d -m -S $NAME $DAEMON $PARAMS
;;

stop)
if [[ `screen -ls |grep $NAME` ]]
then
echo -n "Stoppe $DESC: $NAME"
kill `screen -ls |grep $NAME |awk -F . '{print $1}'|awk '{print $1}'`
killall fear-server.bin
echo " ... Server gestoppt."
else
echo "Konnte keinen laufenden -- $DESC -- finden"
fi
;;

status)
if [[ `screen -ls |grep $NAME` ]]
then
echo "Server is running"
else
echo "Server is offline"
exit 0
fi
;;

restart)
if [[ `screen -ls |grep $NAME` ]]
then
echo -n "Stoppe $DESC: $NAME"
kill `screen -ls |grep $NAME |awk -F . '{print $1}'|awk '{print $1}'`
killall fear-server.bin
echo " ... Server gestoppt ... Restart wird ausgeführt"
else
echo "Konnte keinen laufenden -- $DESC -- finden ... Kommando Start wird ausgeführt"
fi

sleep 2
echo -n "Starte $DESC: $NAME"
cd $DIR
screen -d -m -S $NAME $DAEMON $PARAMS
echo " ... Server gestartet."
;;

*)
echo "Usage: $0 Parameter eingeben {start|stop|restart|status}"
exit 1
;;
esac
Rechte füs das Script stehen auf 755
Beide User befinden sich in der gleichen Gruppe und das Verzeichnis mit den Gameservern gehört dieser Gruppe.

Wäre es nicht möglich, bei dem Scriptaufruf per php den Befehl als anderer User als der vom Apache auszuführen?
zB mit sudo? also dass ich eine Anmeldung durchführe um einen befehl ausuführen, zb shell_exec("sudo -uUSER -pPASS ./script Befehl")

mfg
 
Zuletzt bearbeitet:
haste mal im netz geschaut ob es da nicht shcon fertige WI's gibt ?
 
ja, aber nix was mir zugesagt habe, bzw mein Wi ist ein freies das ich gefunden habe und etwas angepasst habe....alerdings sind da fast nur spezielle Wi'S und ich hatte eigentlich vor ein universelles zu benutzen...es geht ja unterm Strich nur darum, ein Shellscript per php auszuführen....

mfg
 
probier mal folgendes:

Code:
<?php
$output = shell_exec("whoami");
echo $output;
?>

Ich hatte auch mal so ein Webinterface geschrieben dass Shell-Skripte ausführt und irgendwann festgestellt, dass apache zwar als wwwrun die Rechte hatte, php aber als nobody lief.
 
Zuletzt bearbeitet:
Hat zwar nicht mit der Programmierung zu tun, ist aber trotzdem wichtig, damit Anfänger so etwas nicht nachmachen: du versuchst nach dem schließenden </html>-Tag noch mehr Code anzuhängen. Das soll aber alles in den Body (also zwischen <body> und </body>).
 
ich hatte das vor langer langer zeit auch mal gemacht. Aber habe ich "System("")" benutztbei php. Naja.. is schon lange her.

ich bin die ganze zeit shcon am überlegen wie ich ein PHP skirpt schreiben könnte, das ich über einen knopfdruck einen rechner hoch oder runter fahren könnte. Weil ich zu faul bin 3m zu laufen und keinen lust auf Tip Arbeit per SSH habe xD

also wenn du da nen tip hast sag an :D
 
Hat zwar nicht mit der Programmierung zu tun, ist aber trotzdem wichtig, damit Anfänger so etwas nicht nachmachen: du versuchst nach dem schließenden </html>-Tag noch mehr Code anzuhängen. Das soll aber alles in den Body (also zwischen <body> und </body>).

ups sry, voll verpennt bzw übersehen^^

wir natürlich geändert :P

werds mal eure tips testen muss aber schnell noch ein paar gameserver umschreiben....melde mich dann

mfg

Update:
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>[P.S.S.]Gameserver Webinterface</title>
</head>

<body>

<?php
$output = shell_exec("whoami");
echo $output;

$act = $HTTP_GET_VARS['act'];
$output = shell_exec("./fear-start status");
//  Server starten
if ($act=="start")
{
  $output = shell_exec("./fear-start start");
  sleep (3);
  echo"<p><b>$output</b>  <font color='#FF0000'>Server gestartet</font></p>";
}

//   Server neustarten
elseif ($act=="restart")
{
  $output = shell_exec("./fear-start restart");
  sleep (3);
  echo"<p><b>$output</b>  <font color='#FF0000'>Server neu gestartet</font></p>";
}
//   Server stoppen
elseif ($act=="stop")
{
  $output = shell_exec("./fear-start stop");
  sleep (3);
  echo"<p><b>$output</b>  <font color='#FF0000'>Server gestoppt</font></p>";
}
?>
<table border="0" width="80%">
<tr>
    <td colspan="4"><h2 align="center">Serverstatus</h2></td>
</tr>
<tr>
    <td colspan="4" align="center">
        <table border="1">
        <tr>
            <td bgcolor="#666666" align="center"><b><?php echo $output; ?></td>
        </tr>
        </table>    </td>
</tr>
<tr>
    <td height="70" colspan="4" align="center">
    <h2>Script ausführen</h2>
    <p>Optionen<br />
    </p>        </td>
</tr>
<tr>
    <td width="46%" align="right"><p><a href="index.php?act=start">Server starten</a> :</td>
    <td width="10%" align="center"><a href="index.php?act=stop">Server stoppen</a></td>
    <td width="44%" align="left"><a href="index.php?act=restart">Server neustarten</a></td>
</tr>
</table>
</body>
</html>
funzen tuts immer noch nicht^^, aber die optik habe ich jetzt ein bissl angepasst xD
habe irgendwie das gefühl, dass es mit der Rechte Verwaltung zusammen hängt...lässt sich da nix machen in Richtung sudo?
 
Zuletzt bearbeitet:
Du solltest den Script in ne eigene Datei packen und ausführen. Da sollte dir dann etwas angezeigt werden.
 
öhm...

also was soll alles in ein extra script??? und wie soll ich das miteinander verknüpfen?oder in welcher reihenfolge?

bzw, gehts etwas detailierter, steh gerade voll aufm schlauch???:hilfe2:

dank im vorraus...
 
ok, also, bin jetzt weiter gekommen:
script
Code:
<?php
$output = shell_exec("whoami");
echo $output;
?>
gibt "www-data" aus

wenn ich den eigentümer des entsprechenden Gameserver-verzeichnisses auf www-data setze, funktioniert mein wi logischerweis auch.

allerdings würde ich gerne den server als user gamer steuern...was auf die art und weise nicht möglich ist^^

Anregungen erwünscht :P

mfg
 
Und was hindert dich daran

Code:
man sudo

zu lesen, wenn du selber schon festgestellt hast, das das eine Möglichkeit sein könnte?
 
dass ich zu doof das manual umzusetzen, bzw ich einfach nicht raffe, wie ich die sudoers anpassen muss, damit es geht.

dafür, habe ich mein Script jetzt soweit fertig, dass funzt, zumindest für den user www-data.

Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>[P.S.S.]Gameserver Webinterface</title>
</head>

<body bgcolor="#000000">
<?php
$act = $HTTP_GET_VARS['act'];
$output3 = shell_exec("./fear-start status");
$output2 = shell_exec("./fear-start name");
// Status abfragen
if ($act=="status")
{
	$output = shell_exec("./fear-start status");
	sleep (3);
}

//  Server starten
elseif ($act=="start")
{
  $output = shell_exec("./fear-start start");
  $output3 = shell_exec("./fear-start status");
  sleep (3);
}

//   Server neustarten
elseif ($act=="restart")
{
  $output = shell_exec("./fear-start restart");
  $output3 = shell_exec("./fear-start status");
  sleep (3);
}
//   Server stoppen
elseif ($act=="stop")
{
  $output = shell_exec("./fear-start stop");
  $output3 = shell_exec("./fear-start status");
  sleep (3);
}
?>
</p>
<table width="1000" height="411" border="0" align="center">
  <tr>
    <td height="56" colspan="2" bgcolor="#FFFFFF"><strong><u>Servername:</u></strong> <i><font color="#FF0000"><?php echo $output2 ?></font></i></td>
    <td bgcolor="#FFFFFF"><strong><u>Server-Status:</u></strong> <i><?php echo $output3 ?></i></td>
  </tr>
  
  <tr>
    <td colspan="4" bgcolor="#FFFFFF"><strong><u>Server-Meldung:</u></strong> <i><font color="#FF0000"><blink><?php echo $output ?></blink></font></i></td>
  </tr>
  <tr>
    <td height="79" colspan="4" bgcolor="#FFFFFF"><div align="center"><strong><u><font color="#FF0000" size="+3">Optionen</font></u></strong></div></td>
  </tr>
  <tr>
    <td width="243" bgcolor="#FFFFFF"><p align="center"><a href="index.php?act=start">Start</a></p>    </td>
    <td width="243" bgcolor="#FFFFFF"><div align="center"><a href="index.php?act=stop">Stop</a></div></td>
    <td width="243" bgcolor="#FFFFFF"><div align="center"><a href="index.php?act=restart">Restart</a></div></td>
    <td width="253" bgcolor="#FFFFFF"><div align="center"><a href="index.php?act=status">Status(Refresh)</a></div></td>
  </tr>
  <tr>
    <td colspan="4" bgcolor="#FFFFFF"><p align="center"><strong><u>Server-Config bearbeiten<br />
    </u><font size="-1"><em>(erfordert Neustart zum &uuml;bernehmen)</em></font></strong></p>
<!-- Textfeld um die Server-Config zu aendern -->
<center>
<?php

$file = "/var/www/gameservers/fear_public/ServerOptions/ServerOptions.txt";

if (isset($_POST['gesendet'])) {

$datei_speichern = fopen($file, "w");
$_POST['text'] = htmlentities(stripslashes($_POST['text']));
if(fwrite ($datei_speichern, $_POST['text'])){
echo "<i>-- Änderungen erfolgreich gespeichert --</i><br/>";
}else{
echo "<i>-- Fehler beim speichern --</i><br/>";
}
fclose($datei_speichern);

}

echo "<form name=\"form1\" method=\"post\">";
echo "<textarea name=\"text\" cols=\"90\" rows=\"30\">";
echo file_get_contents($file);
echo "</textarea><br/>";
echo "<input type=\"submit\" name=\"gesendet\" value=\"Speichern\"/>";
echo "</form>";


?>
</center>
<!-- Textfeld Ende -->
	</td>
  </tr>
</table>
<p>&nbsp;</p>
</body>
</html>

kann mir noch jemand mit der sudoers helfen? ansonsten kann ich auch damit leben, dass die Gameserver als user www-data ausgeführt werden

danke nochmal
mfg
 
kann mir noch jemand mit der sudoers helfen?

Ja, aber dafür musst du dann auch schon mal sagen, was du daran nicht verstehst?

Evtl. ist das hier:

http://www.wiki.ubuntuusers.de/sudo

für dich besser? Das sollte eigentlich keine Fragen offen lassen.......

Kuck mal, du musst doch nur die /etc/sudoers konfigurieren und den entsprechenden Aufruf im Script setzen, ist doch nicht so schwer.......klar könnte ich dir jetzt auch die Lösung sagen, aber lies mal den Link von mir, dann kommst du von selber drauf und hast noch was gelernt....
 
Zuletzt bearbeitet:
Stimmt, wäre natürlich von Vorteil gewesen wenn ich das gleich gepostet hätte. Und du hast es schon genau auf den Punkt getroffen, ich bekomm die sudoers nicht editiert, bzw Blicks nicht ganz wie....

Der Link von dir funzt nicht?

Der Aufruf in meinem Script müsste dann so aussehen:
Code:
$output=shell_exec("-sudo -u gamer ./script befehl")

Aber wie muss ich das in die Sudoers schreiben, dass der User www-data Dateien lesen, schreiben und ausführen darf, die dem User Gamer gehören. Der genaue Syntax wäre von Vorteil...

Danke
mfg
 
Lies dir mal den korrigierten Link durch. (danke an uzumakinaruto)

EDIT:

Oder vielleicht besser gleich den:

http://wiki.ubuntuusers.de/sudo/Konfiguration

EDIT 2:

Um dich aus deinem Leid zu erlösen:

Granting Access to Specific Files as Another User

The sudo -u entry allows allows you to execute a command as if you were another user, but first you have to be granted this privilege in the sudoers file.

This feature can be convenient for programmers who sometimes need to kill processes related to projects they are working on. For example, programmer peter is on the team developing a financial package that runs a program called monthend as user accounts. From time to time the application fails, requiring "peter" to stop it with the /bin/kill, /usr/bin/kill or /usr/bin/pkill commands but only as user "accounts". The sudoers entry would look like this:

peter ALL=(accounts) /bin/kill, /usr/bin/kill, /usr/bin/pkill

User peter is allowed to stop the monthend process with this command:

[peter@bigboy peter]# sudo -u accounts pkill monthend

Granting Access Without Needing Passwords

This example allows all users in the group operator to execute all the commands in the /sbin directory without the need for entering a password. This has the added advantage of being more convenient to the user:

%operator ALL= NOPASSWD: /sbin/

Von hier:

http://www.linuxhomenetworking.com/...ting_Access_to_Specific_Files_as_Another_User
 
Zuletzt bearbeitet:
also ich habe mir den link durchgelesen, aber auf die erweiterte konfiguration wurde dort nicht eingegangen, sprich wie ich dem benutzer user143 nur useradd erlaube.

ich hatte das vor ca 9 monaten in einem linux kurs (ausbildung) .. aber verpennt mitzuschreiben .. das linuxer immer so schnell tippen müssen :D
 

Ähnliche Themen

Filelisting mit PHP zeigt nicht alles an

Links aus HTML- Datei extrahieren

NagiosGrapher 1.7.1 funktioniert nicht

CMS Problem [php]

document.getElementById() has no properties

Zurück
Oben