2012-06-15 25 views
41

Tengo una escritura del golpe, que corro como esto a través de la línea de comandos:Ejecutar comandos Bash desde PHP

./script.sh var1 var2 

Estoy tratando de ejecutar el comando anterior, después de que yo llamo un determinado archivo php.

Lo que tengo en este momento es:

$output = shell_exec("./script.sh var1 var2"); 
echo "<pre>$output</pre>"; 

Pero Indiferente trabajo. Lo intenté usando exec y system también, pero el script nunca se ejecutó.

Sin embargo, cuando intento ejecutar shell_exec("ls"); funciona y $output es una lista de todos los archivos.

No estoy seguro de si esto se debe a una limitación del VPS que estoy usando o si el problema está en otra parte?

+1

¿En qué camino lo está ejecutando? ¿Qué devuelve 'pwd'? – alex

+1

¿Su script es ejecutable por el usuario 'apache' o' www-data'? – core1024

+2

¿Es ese script bash en el mismo directorio que tu script PHP? ¿El directorio de trabajo del script php también está en el mismo directorio? –

Respuesta

58

Es probable que necesite chdir en el directorio correcto antes de llamar al script. De esta forma puede asegurarse de qué directorio es su script "en" antes de llamar al comando shell.

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

¡Creo que fue el truco! Al menos lo tengo trabajando con un script de prueba simple. Para finalmente verificarlo, tengo que esperar que el servidor del servidor me indique la ruta exacta a los scripts. Voy a marcar la respuesta ahora sin embargo. ¡Gracias! – Andrej

+0

@Andrej: O use la ruta absoluta a su script en lugar de uno relativo. –

+0

@Andrej Si está ejecutando PHP 5.3, puede usar 'chdir (__ DIR __)' para cambiar el directorio al directorio que contiene el script. O para PHP 5.2 o menos, 'dirname (__ FILE __)' hará el truco. –

5

Tu shell_exec es ejecutado por el usuario de www-data, desde su directorio. Usted puede intentar

putenv("PATH=/home/user/bin/:" .$_ENV["PATH"].""); 

Cuando el script se encuentra en /home/usuario/bin Más adelante se puede

$output = "<pre>".shell_exec("scriptname v1 v2")."</pre>"; 
echo $output; 

Para mostrar la salida del comando. (Alternativamente, sin exportar la ruta, intente dar toda la ruta de su script en lugar de solo ./script.sh

+0

Es innecesario alterar la variable de entorno 'PATH'. El directorio de trabajo actual debe cambiarse en su lugar (ver [mi respuesta] (http://stackoverflow.com/a/11052453/24950)). –

+1

Es cierto. Gracias. Estaba usando la configuración de ruta en mi código porque tengo varios ejecutables personalizados en más de una ubicación, y quería que el cuadro de entrada funcionara como una consola, por lo que puedo invocar cualquier comando de esos. Si se va a utilizar para la ejecución de un solo archivo, de todos modos solo podemos usar shell_exec ('/ entero/path/to/file /'); – Hrishikesh

0

Comprobar si no han fijado una open_basedir en php.ini o .htaccess del dominio de lo que usa. Esa cárcel voluntad que en el directorio de su dominio y php conseguirá solamente acceso para ejecutar dentro de este directorio.

Cuestiones relacionadas