2014-10-31 6 views
15

Ich habe eine TMUX-Sitzung, auf der ein Minecraft-Server ausgeführt wird, und ich erstelle eine Webschnittstelle für den Server.Fehler beim Senden von Befehlen an eine TMUX-Sitzung von PHP

Zur Zeit habe ich folgende Dokumente:

command.sh

#!/bin/bash 
tmux send-keys -t minecraft C-z "[email protected]" Enter 

index.php

<?PHP 
    if($_POST) { 
     $commandString = $_POST['inputCommand']; 
     $output = shell_exec('./command.sh $commandString'); 
     echo "<pre>$output</pre>"; 
     } 
?> 
    <form method="post"> 
     <input type="text" name="inputCommand" placeholder="Type Command"/> 
     <input type="submit" value="Execute" /> 
    </form> 

command.sh, dass in einem Terminal funktioniert kann ich Verwenden Sie alle Standardbefehle in der Art

Allerdings kann ich dieses Skript nicht von PHP mit der oben genannten Methode ausführen. Ich habe beide www-data und www-Benutzer zu sudoers hinzugefügt und versuchte,

shell_exec('sudo ./command.sh $commandString')

Aber das hat auch nicht funktioniert.

Wenn auf die Senden-Schaltfläche geklickt wird, wird Ausgabe ausgegeben, aber es ist leer.

Kann jemand bitte helfen, darauf hinzuweisen, wo meine Methodik zur Ausführung des Skripts falsch gelaufen ist?


BEARBEITEN Ich habe zwei Screenshots gemacht, eine vor und eine nachher, um weiter zu klären.

enter image description here

+2

Was läuft falsch? Erhalten Sie einen Fehler? Was bekommst du als Ausgang? Welche Befehle versuchst du, die fehlschlagen? Ist dir klar, dass dies ein * klaffendes * Sicherheitsloch ist? –

+0

Kein Fehler, Ausgabe ist leer, die Befehle sind oben. Dies gibt buchstäblich nichts zurück und der Befehl wird nicht ausgeführt. Deshalb bin ich so verwirrt und poste hier Ja, ich verstehe die Auswirkungen auf die Sicherheit, das ist hinter einem 2 separaten Login-Bildschirme. –

+0

@EtanReisner bitte siehe oben, ich habe einen Screenshot zur Klärung gestellt –

Antwort

9

command.sh hat ein Problem und zur Ausgabe etwas stderr. shell_exec kehrt nur zu Ihnen zurück, so dass Sie den Fehler nicht sehen. Versuchen Sie „2> & 1“ bis Ende des Befehls, wie

$output = shell_exec('./command.sh $commandString 2>&1'); 

anhängt Dies wird stderr nach stdout senden und lassen Sie sehen, was passiert. Entfernen Sie die "2> & 1", sobald Sie das Problem behoben haben. Wie in den Kommentaren erwähnt, stelle ich mir vor, das eigentliche Problem ist, dass Sie einfache Anführungszeichen verwenden, was bedeutet, dass $ commandString wörtlich interpretiert wird. Versuchen Sie stattdessen doppelte Anführungszeichen!

Warnung !!! Das ist wirklich unsicher. Sie übergeben einen unsanitisierten Parameter aus POST an einen Befehl, der als Benutzer in sudoers ausgeführt wird. Unabhängig von zwei Anmeldebildschirmen sollten Sie Ihre Eingaben bereinigen.

+8

Eigentlich * wie geschrieben *, das ist vollkommen sicher - es gibt keine Variablensubstitution. Der auszuführende Befehl ist eine konstante Zeichenkette. Und deshalb kann das Verhalten nicht wie erwartet sein. "Reparieren" wird natürlich die verwarnte Schwachstelle einführen. –

+4

Ich benutzte Ihren obigen Vorschlag der Umleitung von Standardfehler auf Standard heraus, fand ich heraus, dass TMUX die Zeichenfolge nicht finden konnte, änderte ich es in su -c Befehl und es funktionierte. Ich fand auch einen besseren Weg etwa 10 Minuten, nachdem dies funktioniert, dass Minecraft eine eingebaute Rcon-Funktion hat und ich verwendet, um über php Post Forms zu kommunizieren. Also, keine shell_exec und alles viel sicherer. –

+0

@MichaelBetterton Ehrfürchtig Ich bin froh, dass ich dir helfen konnte und hoffe, dass deine zukünftigen Erfahrungen auf SO nicht mehrere Meta-Threads beinhalten, die darüber debattieren, was in Ordnung ist :) – ErlVolton

Verwandte Themen