Foros del Web » Programando para Internet » PHP »

Shell_exec en Windows

Estas en el tema de Shell_exec en Windows en el foro de PHP en Foros del Web. He estado buscando en el foro y las repsuestas sobre la ejecución d este comando son siempre sobre Linux así q me veo en la ...
  #1 (permalink)  
Antiguo 04/09/2006, 05:45
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 17 años, 8 meses
Puntos: 0
Shell_exec en Windows

He estado buscando en el foro y las repsuestas sobre la ejecución d este comando son siempre sobre Linux así q me veo en la obligación de preguntar.

No sé por qué, pero cuando intento ejecutar un comando, el cual se puede ejecutar desde cualkier lugar x estar dentro del PATH, no me lo ejecuta a menos q el ejecutable en cuestión esté en la misma carpeta q el script php.

En mi caso se trata de creación de usuarios y manejo de permisos a través de los ejecutables 'cacls' y 'net user' con sus parámetros correspondientes (Cluster, con esto consigo crear usuarios virtuales y poner permisos a las carpetas para el acceso via FTP x el q pregunté en otro tema).

Aún usando la ruta absoluta (C:\Windows\system32) como relativa mediante ../ (también he probado con \) y dándole permisos a los ejecutables al usuario q se autentifica en el sitio web no hay manera de q lo ejecute a menos q sitúe el archivo en la misma carpeta.

Aquí va el código q empleo:

Código PHP:
<?php
echo "Inicia el proceso:<br>";
$rootftp='c:/inetpub/ftproot';
$systemroot='c:/windows/system32';
$app_users="net user";
$app_perms="cacls.exe";
//Voy a obtener la lista de permisos de la carpeta especificada
echo "<br>Obteniendo lista de permisos de la carpeta <strong>$rootftp</strong>:<br>";
$ruta="$systemroot/$app_perms";
if (
file_exists ($ruta)) {
    echo 
"El archivo $ruta esta disponible...<br>";
    if(
$resultado=trim(shell_exec ("$ruta $rootftp"))) {
        echo 
"<pre>$resultado</pre><br>";
    } else {
        echo 
"No pudo ejecutarse el comando $ruta $rootftp.<br>";
    }
    echo 
"Segunda prueba:<br>";
    if (
$resultado=system("$ruta $rootftp",$retval)) {
        echo 
"Ultima linea: $resultado<br>Retorno: $retval<br>";
    }else {
        echo 
"No pudo ejecutarse el comando $ruta $rootftp.<br>";
    }
} else {
    echo 
"No se encontro el archivo $ruta<br>";
}
echo 
"<br>Fin del proceso.";
?>
Nótese q también he probado a usar la '\' (\\ según tengo entendido) así q no se me ocurre qué más falla. La solución más fácil es copiar el ejecutable a la misma carpeta pero kiero evitar eso si es posible.

Saludos.
__________________
La muerte es un camino que todos debemos recorrer...

Última edición por djreficul; 04/09/2006 a las 11:49
  #2 (permalink)  
Antiguo 04/09/2006, 11:50
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 17 años, 8 meses
Puntos: 0
No sé lo q hacer para evitar poner los ejecutables en la misma carpeta q el script. He probado incluso a darle control total al usuario Todos y nada.

A ver si a alguien se le okurre algo. Y de verás q he probado a usar \ o \\ o / para las rutas x si akaso y nada de nada, no rula.

Saludos.
__________________
La muerte es un camino que todos debemos recorrer...
  #3 (permalink)  
Antiguo 05/09/2006, 06:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
mm En principio PHP impone restricciones a los ejecutables que se pueden "ejecutar" (valga la rebundancia) y en que rutas. Esto lo hace cuando usas "safe mode" (que creo que no es tu caso):

http://www.php.net/manual/en/features.safe-mode.php

Sobre todo la directiva: safe_mode_exec_dir es la que indica en que rutas puedes ejecutar archivos .. normalmente se indica "./" (el directorio en que estás) y tal vez otras rutas concretas o una sóla definida donde estableces permisos y tienes el control.

Por otro lado en php.net hay algunos comentarios de interes:

Cita:
rymfaxe (at) hotmail (dot) com
04-Dec-2005 01:50
Starting batch or exe files (from a local Apache server 1.3.24 with PHP 4.3.1) to be executed within WinXP SP2 and having the program running in background - which certainly is tricky.

I figured this peace of code makes it very possible.
Instead of using exec() I prefered popen() adding the parameter /b which makes it run in the background, thus having PHP script continued to be interpreted contrary to be hanging in the process.

Código PHP:
<?php
function callTool ($path,$file) {
   
chdir($path); $call $path.$file;
   
pclose(popen('start /b '.$call.'''r')); 
}

// -- Call tool1 -----
$location "c:\path\to\desired\folder"
$filename "\tool1.exe";
callTool($location,$filename);

// -- Call tool2 -----
$location "c:\path\to\desired\folder"
$filename "\tool2.bat";
callTool($location,$filename);

// -- Call tool3 -----
$location "c:\path\to\desired\folder"
$filename "\tool3.com";
callTool($location,$filename);
?>
This example assumes that the Apache properties locally has bin told to 'allowe this server to interact with desktop' which on WinXP is to be set under Start > Run > services.msc - next, right click "Apache...", select properties and click on the 'login tab'.

Hope someone to benefit out of this stuff.
Otro más:
Cita:
Shaun
26-Jan-2005 06:53
Trying to use 'exec' to run a helper executable on Win2K3 (and I'm told this also happens on Win2K) from a PHP script running on IIS, failed to invoke the executable.

Running the same PHP script on Win2K using Apache to serve the page calling the same helper executable worked.

Solution: On Win2K3 (and probably Win2K), give the IIS IUSR_xxxxx guest user Read & Execute permissions to Cmd.exe found in the System32 folder under Windows root directory.

This one had me confused longer than it should have! Hope this saves others from the same fate!
Te recomiendo ver más comentarios (de los usuarios) al respecto en:
http://www.php.net/manual/en/ref.exec.php

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 06/09/2006, 01:59
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 17 años, 8 meses
Puntos: 0
Gracias Cluster. Haré pruebas hoy a ver si eso funciona xq encontré la forma de hacerlo poniendo como usuario para acceso anónimo al Administrador pero no quiero usar esta opción xq imagino q es un riesgo para la seguridad.

Tengo otra pregunta más q añadir. Si un proceso pide confirmación (pulsando una tecla y el intro x ejemplo) ¿Cómo podría enviar esa información al proceso en ejecución? ¿Es posible?

Saludos.
__________________
La muerte es un camino que todos debemos recorrer...
  #5 (permalink)  
Antiguo 06/09/2006, 05:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Cita:
Tengo otra pregunta más q añadir. Si un proceso pide confirmación (pulsando una tecla y el intro x ejemplo) ¿Cómo podría enviar esa información al proceso en ejecución? ¿Es posible?
Desde PHP con las funciones "exec()" y afines ... no. El tipo de aplicación que con PHP puedes ejecutar son del tipo "sin intervención del usuario" .. algo tipo envias comando a ejecutar y este hacer su proceso (a lo sumo arroje un resultado del mismo o error por "consola").

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 06/09/2006, 10:19
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 17 años, 8 meses
Puntos: 0
La confirmación no la tiene q hacer el usuario, simplemente es q el programa después de ejecutarse pregunta si estas seguro de realizar las acciones pertinentes y yo sé q quiero contestar sí, pero no sé si se podrá hacer.

Sobre los comentarios q hay en php.net he estado mirándolos y probándolos, incluyendo un programa aparte llamado psexec, y sigue dándome "Acceso denegado. X-Powered-By: PHP/5.1.1 Content-type: text/html" mientras mantenga al usuario Invitado de Internet como el q inicia sesión en el sitio web pese a tener permisos en "cmd.exe" e incluso dándoselos en "net.exe" q es el q me peta y da el error anteriormente mencionado. No sé qué hacer para no tener q usar un Administrador para realizar estas tareas q necesito para mi aplicación.

Saludos.
__________________
La muerte es un camino que todos debemos recorrer...
  #7 (permalink)  
Antiguo 06/09/2006, 10:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Cita:
La confirmación no la tiene q hacer el usuario, simplemente es q el programa después de ejecutarse pregunta si estas seguro de realizar las acciones pertinentes y yo sé q quiero contestar sí, pero no sé si se podrá hacer.
Si por línea de comandos tienes alguna opción tipo "asumir SI a toda pregunta" .. eso deberías usar.

Aunque tu tengas claro que "decir" .. igualmente la confirmación es requerida y eso no es un proceso que puedas automatizar o interactuar con PHP.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 18/09/2006, 04:46
dex
 
Fecha de Ingreso: septiembre-2003
Mensajes: 4
Antigüedad: 20 años, 5 meses
Puntos: 0
Hola a todos.
Estoy con un problema "parecido".
Tengo que ejecutar una aplicación externa desde mi script php. En un ordenador local,si me funciona, se ejecuta la aplicación exactamente como quiero, pero al pasarlo al ordenador donde tiene que funcionar, la aplicación se ejecuta, pero no hace nada.
Me di cuenta con el administrador de tareas de windows que si que se está ejecutando, pero como proceso, no como aplicación. ¿alguien sabe alguna forma de que se ejecute como aplicación?
Gracias.
  #9 (permalink)  
Antiguo 18/09/2006, 05:14
dex
 
Fecha de Ingreso: septiembre-2003
Mensajes: 4
Antigüedad: 20 años, 5 meses
Puntos: 0
Vale, nada, ya lo he solucionado.
Gracias de todas formas.
  #10 (permalink)  
Antiguo 20/09/2006, 03:07
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 17 años, 8 meses
Puntos: 0
Cita:
Iniciado por dex Ver Mensaje
Vale, nada, ya lo he solucionado.
Gracias de todas formas.
No estaría de más q dijeras qué has hexo x si le sirve a otros.

Saludos.
__________________
La muerte es un camino que todos debemos recorrer...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 05:07.