You are not logged in.

  • Login

1

Tuesday, February 15th 2011, 4:50pm

PHP - Kommandozeilen ausgabe

Guten Abend,

zu meinem Problem, die Eingabe an sich funktioniert, aber nicht die Ausgabe.
Bei der Installation eines Gameserver über das Web wäre es schön wenn man die Ausgabe in "Echtzeit" erhält.

Am besten wie bei Webmin, bei der "Befehls-Shell" oder nach dem Aktualisieren der Pakete.

Ist es möglich irgendwie mittels Javascript / Ajax / Perl so etwas zu realisieren, wenn ja, wie?

Hier der aktuelle Code:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
...
include "class.shell2.php";
 
$ssh = new shell2; // init class
 
    //$ssh = new Net_SSH2($_POST['ip']);
//$ssh->login($user,$pass,$host
    if (!$ssh->login('root', 'PASSWD','IP')) {
        $ars.='Login Failed<br/>'.$ssh->error;;
    }else{
$kunde = $_POST['kunde'];
$gid = $_POST['gid'];
$ftppass =$_POST['ftppass'];
 
$cmd_line = '-ip '.$_POST['ip'].' -game '.$game.' -port +map '.$_POST['map'].' -maxplayers '.$_POST['slots'];
$ssh->exec_cmd("/verzeichniss/zu/script/ssh.sh -k getinstall -i $kunde -m $gid -g $game -w $ftppass -p $cmd_line -e $ex_daemon");
$ars='<h3>Output</h3>
<pre>'.$ssh->get_output().'</pre>';
 
}
...



Folgendes wird in der .sh ausgeführt:

Bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
...
 
# Get command line args
while getopts "i:g:e:p:n:k:j:m:w:" OPTION
do
     case $OPTION in
         i)
             GS_USER=$OPTARG
             ;;
         g)
             GAME=$OPTARG
             ;;
         e)
             DAEMON=$OPTARG
             ;;
         p)
             CMD_OPTS=$OPTARG
             ;;
         n)
             SCREEN_NM=$OPTARG
             ;;
	 k)
	     CHANGER=$OPTARG
	     ;;
         j)
             SRV_NICK=$OPTARG
             ;;
	 m)
	     GS_ID=$OPTARG
	     ;;
	 w)
	     PWD=$OPTARG
	     ;;
         ?)
             usage
             exit
             ;;
     esac
done
 
...
 
getinstall() { 
  # gameserver = 10013 | ARS
  # gameserver = 10004 | DSWh
  #useradd -p $PWD -u 10004 -o -s /bin/false -d /verzeichniss/zu/den/gameserver/$GS_USER$GS_ID gs$GS_USER$GS_ID
  mkdir /verzeichniss/zu/den/gameserver/$GS_USER$GS_ID
  cd /verzeichniss/zu/den/gameserver/
  ./steam -command update
  ./steam -command update -game "$GAME" -dir /verzeichniss/zu/den/gameserver/$GS_USER$GS_ID
  chown -R gs$GS_USER$GS_ID /verzeichniss/zu/den/gameserver/$GS_USER$GS_ID/*
if [ -d /verzeichniss/zu/den/gameserver/$GS_USER$GS_ID/orangebox ]
then
ORANGE= orangebox
else
ORANGE=
fi
 
  cd /verzeichniss/zu/den/gameserver/$GS_USER$GS_ID/$ORANGE
  sudo -u gs$GS_USER$GS_ID screen -dmS $GS_USER$GS_ID ./$DAEMON $CMD_OPTS
 
}
...


Die klasse ist von folgender Seite:

http://php-ssh2.sourceforge.net/


Hoffe es gibt da irgendeine Lösung für^^
Mit Zitat antworten

2

Tuesday, February 15th 2011, 11:44pm

Wenn ich dich richtig verstanden habe, dann möchtest du die Ausgabe quasi häppchenweise an den Browser ausliefern, da ja immer noch etwas nachkommt.
Das sollte mit PHP und der Funktion flush() funktionieren.

Hier mal ein kleiner Beispielcode:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
<?php
$count = 1;
while($count <= 10) {
	echo str_pad("$count", 4096); // Der String sollte auf min. 4096 Bytes aufgefüllt werden, da sonst der Browser nicht anfängt die Seite zu rendern
       //Quelle: http://www.ureader.de/message/1654089.aspx
	flush();
	$count += 1;
	sleep(2);
}
?>

3

Wednesday, February 16th 2011, 8:36pm

Danke für deine Hilfe. Dank der SSH2 Libary von PHP konnte ich den Code nach dem Beispiel umwandeln und es funktioniert Perfekt :)

Hier der Code:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$connection = ssh2_connect('IP', 22);
ssh2_auth_password($connection, 'root', 'PWD');
$kunde = $_POST['kunde'];
$gid = $_POST['gid'];
$ftppass =$_POST['ftppass'];
 
$cmd_line = '-ip '.$_POST['ip'].' -game '.$game.' -port +map '.$_POST['map'].' -maxplayers '.$_POST['slots'];
 
$stream = ssh2_exec($connection, "/verzeichniss/zu/script/ssh.sh -k getinstall -i $kunde -m $gid -g $game -w $ftppass -p $cmd_line -e $ex_daemon");
 
                stream_set_blocking($stream, true);
                while($line = fgets($stream)) {
                        //flush();
                        echo str_pad("$line", 4096).'<br/>';
			flush();
			//$count += 1;
			sleep(1);
			//echo $line."<br />";
                }


Das mit dem stream_set_blocking() ist direkt von php.net: http://www.php.net/manual/en/function.ssh2-exec.php#79643

4

Wednesday, February 16th 2011, 8:38pm

PS: Mod kann closen ^^
Hab das Thema als erledigt markiert mit dem Post, ka wie das mit dem Editieren & Erledigen geht ;)

Similar threads

Social bookmarks