Foros del Web » Programando para Internet » PHP »

Pequeño problema con exec()

Estas en el tema de Pequeño problema con exec() en el foro de PHP en Foros del Web. Muy buenas; Estoy montando un server en unix y en mi web estoy usando la funcion exec() de php para ejecutar comandos de unix y ...
  #1 (permalink)  
Antiguo 21/10/2009, 15:40
 
Fecha de Ingreso: octubre-2009
Mensajes: 17
Antigüedad: 14 años, 6 meses
Puntos: 0
Pequeño problema con exec()

Muy buenas;
Estoy montando un server en unix y en mi web estoy usando la funcion exec() de php para ejecutar comandos de unix y va bien con una pega, siempre me ejecuta los comandos en la carpeta donde este la web, y aunque haga por tuberias un cd ../ me sigue ejecutando en la carpeta donde este la web.
Entonces tendría dos soluciones o algo para poder cambiar de directorio o bien que el comando tenga una manera de poder llamarlo a otro directorio.
El comando en concreto es: make telosb install.
Y si me pudierais ayudar os lo agradecería bastante ya que ese comando tiene que ser lanzado en otro directorio dinstinto al de la web, por tema de permisos no habría problemas porque el server es mio.
  #2 (permalink)  
Antiguo 21/10/2009, 16:44
Avatar de wordgeist  
Fecha de Ingreso: abril-2009
Mensajes: 36
Antigüedad: 15 años
Puntos: 0
Respuesta: Pequeño problema con exec()

nunca va a cambiar de directorio la ejecucion de tu comando en php, cuando mandes llamar llamar la ejecucion del comando hazlo apuntando a donde quieras ejecutarlo por ejemplo exec(/etc/init.d/restart mysql.d)...espero te ayude
  #3 (permalink)  
Antiguo 21/10/2009, 16:59
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Pequeño problema con exec()

así es, simplemente debes usar la ruta absoluta del ejecutable...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 21/10/2009, 19:47
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Pequeño problema con exec()

Hola,

En este caso va a dar igual que llames a ./make que a /usr/bin/make.
Supongo que el archivo makefile va a estar en otro directorio.

También si ejecutas /usr/bin/make /home/user1/telosb, va a dar lo mismo, porque va a compilar (o realizar la actividad del makefile) en el directorio actual, el root o similar del web (va a crear todos los directorios, compilados, etc. en el directorio actual).

Ahora bien ... el programa make tiene muchas formas para manipular el directorio donde se va a ejecutar, puedes usar los parámetros:

Código:
`-C dir'
`--directory=dir'
    Change to directory dir before reading the makefiles.
Va a depender de la versión de make que estes usando y permisos.

Yo usaría un script del shell.
Código:
#!/bin/bash
cd /home/user1/
make install
También va a depender de permisos.

Saludos,
  #5 (permalink)  
Antiguo 22/10/2009, 07:36
 
Fecha de Ingreso: octubre-2009
Mensajes: 17
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Pequeño problema con exec()

Muchas gracias por las respuestas;
entonces si por ejemplo en estos directorios de mac:
la web está en /Applications/Xampp/xampfiles/htdocs/miweb/ y quiero ejecutarlo en /tmp/carpeta/
Funcionaria esto no?: make -C ../../../../../tmp/carpeta/ telosb install.
dandole antes permiso de escritura a la carpeta /tmp/carpeta/
me ejecutaría todo en esa carpeta y si genera algo lo guardaría en esa carpeta??
Muchas Gracias
  #6 (permalink)  
Antiguo 22/10/2009, 08:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Pequeño problema con exec()

No es necesario que uses ../ mejor usa la ruta absoulta /tmp/carpeta

Saludos.
  #7 (permalink)  
Antiguo 22/10/2009, 09:11
 
Fecha de Ingreso: octubre-2009
Mensajes: 17
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Pequeño problema con exec()

Gracias usaré la ruta absoluta, pero sería en ese orden verdad? primero el make -C /direccion/ y despues el telosb install
que el telosb install van al final.
  #8 (permalink)  
Antiguo 22/10/2009, 11:47
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Pequeño problema con exec()

Hola,

Sería mas aconsejable que leyeras la página 'man' de 'make'.
Código:
man make
El programa 'make' lee un archivo makefile y lo construye, telosb(?) e install son targets dentro de ese makefile. Dentro del makefile pueden haber rutas absolutas, includes, etc. Cuando haces un make install 'normalmente' lo instala en /usr/bin o /usr/local/bin o en otros lugares dependiendo de ciertas variables del sistema. Así también normalmente todos los archivos temporales para construir 'telosb' los crea en el directorio actual.

Los parámetro de make son :

Código:
$ make --help
Modo de empleo: make [opciones] [objetivo] ...
Opciones:
...
  -C DIRECTORIO, --directory=DIRECTORIO
                              Se cambia al DIRECTORIO antes de hacer nada.
...
Saludos,
  #9 (permalink)  
Antiguo 22/10/2009, 13:29
 
Fecha de Ingreso: octubre-2009
Mensajes: 17
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Pequeño problema con exec()

Bueno los temporales me dan igual mientras que los de verdad vayan donde tienen que ir, bueno lo de telosb es porque haciendo ese make dentro de una carpeta en concreto (dentro de tinyOS) manda un programa a un microsensor.
Supuestamente aunque cree los temporales en la carpeta de la web debería cumplir su función no?
  #10 (permalink)  
Antiguo 22/10/2009, 15:46
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Pequeño problema con exec()

Hola,

Cita:
Iniciado por Grobix Ver Mensaje
... Supuestamente aunque cree los temporales en la carpeta de la web debería cumplir su función no?
Esos son detalles de implementación, y me resulta muy difícil saber si va a funcionar o no. Pero creo que si te funciona desde la terminal con el comando 'make install' en la carpeta adecuada, tendría que funcionar con el comando exec() con pequeñas diferencias. La principal diferencia va a ser el usuario con que se ejecuta el comando. Está demás comentar que tienes que tomar en cuenta la seguridad, pero eso ya es otra cosa.

Saludos,
  #11 (permalink)  
Antiguo 26/10/2009, 13:28
 
Fecha de Ingreso: octubre-2009
Mensajes: 17
Antigüedad: 14 años, 6 meses
Puntos: 0
Bueno ya lo he probado y por consola funciona perfectamente, pero por el exec() no funciona, en concreto el comando que quiero ejecutar es:
make -C /users/grobix/tinyos-2.x/apps/$nombre/ telosb

Tampoco funciona si cambio la variable de $nombre por el nombre que quiero, y me parece raro que en la consola funcione perfectamente.
¿Sabeis otra manera facilona de hacerlo? con algun programita que pueda pasarle la variable nombre o algo? es que estoy un poco bloqueado ya.
Muchas gracias

¿Puede ser que tenga que cambiar algo del php.ini?? Aunque el resto de comandos que ejecuto desde exec (chmod, mkdir) me funcionan perfectamente

Última edición por GatorV; 26/10/2009 a las 15:04
  #12 (permalink)  
Antiguo 26/10/2009, 18:32
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Pequeño problema con exec()

Hola,

¿Quien hizo el makefile? ¿Que contiene adentro el makefile?
Creo que el único que te puede resolver esta situación es el que hizo el makefile.


Dentro de mi directorio de usuario en Linux Debian, hice un directorio llamado apps y dentro de ese sub-directorio otro llamado hello. Para que TODO el mundo pueda escribir en ese directorio (hello) le cambié permisos a 777.

Dentro del directorio hello hice un makefile que simplemente crea un archivo con un texto adentro. Para que TODO el mundo pueda leer el makefile le cambié los permisos a 666. El objetivo es mostrar la ubicación donde quedaría el archivo temporal hello.txt y verificar los permisos:

makefile
Código:
hello:
        echo 'Hello World!' > hello.txt
Dentro del sitio web, en Apache, hice un nuevo archivo PHP, para ejecutar el makefile anterior.

Código PHP:
Ver original
  1. <html>
  2. <head><title>Hello World!</title></head>
  3. <body>
  4. <?php
  5. $app = 'hello';
  6. echo exec ("make -C /home/hackmanc/apps/$app/ hello");
  7. ?>
  8. </body>
  9. </html>

Y al ejecutarlo me crea el archivo hello.txt en la carpeta correspondiente.

Código:
hackman@debian:~/apps/hello$ ls -lah
total 16K
drwxrwxrwx 2 hackman  hackman  4.0K 2009-10-26 17:58 .
drwxr-xr-x 3 hackman  hackman  4.0K 2009-10-26 17:56 ..
-rw-r--r-- 1 www-data www-data   13 2009-10-26 17:58 hello.txt
-rw-rw-rw- 1 hackman  hackman    42 2009-10-26 17:57 makefile
hackman@debian:~/apps/hello$ cat hello.txt
Hello World!
hackman@debian:~/apps/hello$
¿Que significa esto? Que el makefile se ejecutó correctamente en la carpeta adecuada, con los permisos adecuados, con PHP 5.2 con una instalación nueva por defecto en Apache 2 en Linux Debian Etch virtualizada con VirtualBox. Existe una variable en php.ini para prevenir esto ... pero si la cambiaste entonces sabes cual es, sino no tenias que tocarla.

Si en tu caso no funciona el problema no es de PHP, posiblemente el makefile esté ejecutando un comando que no tiene los permisos suficientes. Al usar make install se instala en /usr/bin ... ¿Acaso el usuario de apache www-root tiene permisos de escritura allí? NO ... y no los debe tener.

Saludos,

ps:

Cita:
Última edición por GatorV; Hoy a las 15:04
¿Que habrá modificado?
  #13 (permalink)  
Antiguo 27/10/2009, 06:20
 
Fecha de Ingreso: octubre-2009
Mensajes: 17
Antigüedad: 14 años, 6 meses
Puntos: 0
Pues no lo se, el makefile es algo complejo, es para enviar un programa a un microsensor, poniendo el comando make -C /users/grobix/tinyos-2.x/apps/$nombre/ telosb desde la consola funciona perfectamente y me hace todo bien, y en el momento que lo pongo desde exec("make -C /users/grobix/tinyos-2.x/apps/$nombre/ telosb") no me funciona, por tema de permisos no es el problema con chmod le di 777 a todos los archivos implicados, la configuracion del php no la he tocado.
Ahora intente hacerlo desde una pequeña aplicacion en C pero me he encontrado con otro problema.
creo y compilo la aplicacion perfectamente con exec pero cuando quiero ejecutarla (tiene todos los permisos) solo puedo ejecutarla con exec(open ejecutable) entonces no puedo pasarle las variables, yo se las querria pasar como en consola que sería algo así exec(./ejecutable variables).

Muchas gracias

edito:
Ahora lo he intentado hacer en java y no hace exec("java instala")
:( solo me encuentro con problemas

Ya lo tengo solucionado, hice que por php creara un string que lo alamcenara en un .c, en ese .c todo el programa en C con las variables ya dentro, despues con un exec lo abro y listo, podeis cerrar el post

Última edición por GatorV; 27/10/2009 a las 11:16
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:58.