PHP - Kommandozeilen ausgabe

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • 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:

    Quellcode

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



    Folgendes wird in der .sh ausgeführt:

    Quellcode

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


    Die klasse ist von folgender Seite:

    php-ssh2.sourceforge.net/


    Hoffe es gibt da irgendeine Lösung für^^
    Mit Zitat antworten
  • 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:

    Quellcode

    1. <?php
    2. $count = 1;
    3. while($count <= 10) {
    4. 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
    5. //Quelle: http://www.ureader.de/message/1654089.aspx
    6. flush();
    7. $count += 1;
    8. sleep(2);
    9. }
    10. ?>
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • 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:

    Quellcode

    1. $connection = ssh2_connect('IP', 22);
    2. ssh2_auth_password($connection, 'root', 'PWD');
    3. $kunde = $_POST['kunde'];
    4. $gid = $_POST['gid'];
    5. $ftppass =$_POST['ftppass'];
    6. $cmd_line = '-ip '.$_POST['ip'].' -game '.$game.' -port +map '.$_POST['map'].' -maxplayers '.$_POST['slots'];
    7. $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");
    8. stream_set_blocking($stream, true);
    9. while($line = fgets($stream)) {
    10. //flush();
    11. echo str_pad("$line", 4096).'<br/>';
    12. flush();
    13. //$count += 1;
    14. sleep(1);
    15. //echo $line."<br />";
    16. }
    Alles anzeigen


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