2016-08-21 3 views
1

Ich versuche, ein Bash-Skript mit PHP auszuführen, aber das Problem ist, dass das Skript einige Befehle und Informationen während der Ausführung eingegeben haben muss.Ausführen von Bash-Skript mit PHP und Eingabe von Befehlen

Dies ist, was I`m

$old_path = getcwd(); 
chdir('/my/path/'); 
$output = shell_exec('./script.sh'); 
chdir($old_path); 

Das Skript ausführen OK, aber I`m nicht in der Lage der Eingabe mit jeder Option auf dem Skript.

+0

Akzeptiert das Skript Argumente? – segFault

+0

Nein, Argumente werden für das Skript nicht akzeptiert, das Skript läuft und fragt nach einer Eingabe wie, geben Sie den Namen und für viele andere Eingaben ein –

+0

Mögliches Duplikat von [PHP, shell \ _exec und einer Eingabe] (http://stackoverflow.com/questions/11737251/php-shell-exec-and-an-input) –

Antwort

0

shell_exec() und exec() können keine interaktiven Skripts ausführen. Dafür brauchst du eine echte Shell. Hier ist ein Projekt, das Sie eine echte Bash Shell gibt: https://github.com/merlinthemagic/MTS

//if the script requires root access, change the second argument to "true". 
$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', false); 

//What string do you expect to show in the terminal just before the first input? Lets say your script simply deletes a file (/tmp/aFile.txt) using "rm". In that case the example would look like this: 

//this command will trigger your script and return once the shell displays "rm: remove regular file" 

$shell->exeCmd("/my/path/script.sh", "rm: remove regular file"); 

//to delete we have to press "y", because the delete command returns to the shell prompt after pressing "y", there is no need for a delimiter. 

$shell->exeCmd("y"); 

//done 

Ich bin sicher, dass die Rückkehr des Skripts ist weitaus komplexer, aber das Beispiel oben gibt Ihnen ein Modell dafür, wie mit der Schale zu interagieren.

Ich würde auch erwähnen, dass Sie möglicherweise nicht ein Bash-Skript verwenden, um eine Sequenz von Ereignissen durchzuführen, sondern geben Sie die Befehle nacheinander mit der Methode exeCmd(). Auf diese Weise können Sie mit der Rückgabe umgehen und die gesamte Fehlerlogik in PHP beibehalten, anstatt sie zwischen PHP und BASH aufzuteilen.

Lesen Sie die Dokumentation, es wird Ihnen helfen.

Verwandte Themen