shell_exec - Comando PHP exec(): ¿cómo especificar el directorio de trabajo?
shell_exec not working (5)
Mi script, vamos a llamarlo execute.php, necesita iniciar un script de shell que está en la subcarpeta Scripts. El script debe ejecutarse de modo que su directorio de trabajo sea Scripts. ¿Cómo lograr esta simple tarea en PHP?
La estructura del directorio se ve así:
execute.php
Scripts/
script.sh
El directorio de trabajo actual es el mismo que el directorio de trabajo actual del script PHP.
Simplemente use chdir()
para cambiar el directorio de trabajo antes de exec()
.
Esa no es la mejor manera.
Al pasar lo siguiente a la función exec, también se ejecutará ./scripts.sh, que ahora podría eliminar todo el sistema UNIX, al ejecutar problemas de ruta:
exec(''cd /patto/scripts; ./script.sh'');
Utilice &&
(para ejecutar solo el segundo comando después de la finalización exitosa del primero) en lugar de; (punto y coma) - que es solo como presionar la tecla enter.
O cambia a ese directorio dentro del comando exec ( exec("cd Scripts && ./script.sh")
) o cambia el directorio de trabajo del proceso PHP usando chdir()
.
Para un mayor control sobre cómo se ejecutará el proceso secundario, puede usar la función proc_open() :
$cmd = ''Scripts/script.sh'';
$cwd = ''Scripts'';
$spec = array(
// can something more portable be passed here instead of /dev/null?
0 => array(''file'', ''/dev/null'', ''r''),
1 => array(''file'', ''/dev/null'', ''w''),
2 => array(''file'', ''/dev/null'', ''w''),
);
$ph = proc_open($cmd, $spec, $pipes, $cwd);
if ($ph === FALSE) {
// open error
}
// If we are not passing /dev/null like above, we should close
// our ends of any pipes to signal that we''re done. Otherwise
// the call to proc_close below may block indefinitely.
foreach ($pipes as $pipe) {
@fclose($pipe);
}
// will wait for the process to terminate
$exit_code = proc_close($ph);
if ($exit_code !== 0) {
// child error
}
Si realmente necesita que su directorio de trabajo sea scripts, intente:
exec(''cd /path/to/scripts; ./script.sh'');
De otra manera,
exec(''/path/to/scripts/script.sh'');
debería ser suficiente.