Ejecutar comandos shell mediante php

Más de una vez hemos deseado ejecutar algún comando de la shell en unix en nuestra cuenta de hospedaje, pero desafortunadamente nuestro proveedor no nos ha habiblitado ningún acceso ssh. Es posible ejecutar comandos shell con el siguiente código:

Creamos un fichero llamado exec.php con el siguiente contenido:

<?php
exec($_GET[’cmd’],$salida);
foreach($salida as $line) { echo "$line<br>"; }
?>

Para ejecutar cualquier comando lo haremos de la siguiente forma:

http://tudominio/exec.php?cmd=ls

y obtendremos la lista de ficheros en el directorio actual.
Una buena aplicación puede ser hacer una copia de seguridad de nuestra web en un .tar.gz y descargarla vía web.

http://tudominio/exec.php?cmd=tar -cvzpf copia.tar.gz *

Con esto obtendremos un fichero comprimido llamado copia.tar.gz, conteniendo toda la copia de seguridad de nuestra web el cual podremos descargar sencillamente.

El resto es simplemente ejecutar comandos, rutas y demás ;)

Ahora bien, tened cuidado donde lo subís por supuesto que esté protegido con contraseña para limitar el acceso sólo a nosotros mismos.

14 comentarios en “Ejecutar comandos shell mediante php”

  1. jgarcía PR: 6dijo:

    Hummmm… qué peligro tienes, Fernando….

    ¡Estupenda información!

  2. yuri PR: 0dijo:

    Buen truco, me lo apunto, que quizás me venga bien para algún que otro cacharreo en el que ando rompiéndome la cabeza. :)

  3. Damian PR: 0dijo:

    Quisiera saber por que ejecutas cmd, esa es la manera de llamar la shell en windows, como llamaria la shell en un linux o unix.

    Gracias

  4. Mauro PR: 0dijo:

    Super bueno tu aporte!!!

    Con esto ya tengo muchas herramientas para explorar y aplicar!
    Gracias!

  5. DeiMoS PR: 2dijo:

    Damian, ejecuto “cmd” porque en el código php lo uso como variable y se lo paso por url.
    Este código sólamente es válido para un sistema unix.

  6. Ivo Sandoval PR: 0dijo:

    Que peligro tiene esa función, ejecución de comandos en el servidor.
    ¿Acepta la función rm? :D

    Salu2

  7. DeiMoS PR: 2dijo:

    Claro, acepta cualquier comando por consola, otra cosa es que por permisos del servidor nos deje ejecutarlo o no. Date cuenta que al acceder vía web el usuario con el que ejecutamos dichos comandos suele ser “apache” o “www-data”: un usuario generalmente con pocos permisos, pero los suficientes para borrar una carpeta que le hayamos asignado permisos de escritura, ej: fotos de una galería gestionable vía web.

  8. Juvit PR: 0dijo:

    Hola, he probado el codigo que publicaste, pero no funciona en mi web, ni me manda nada y no se porque. Si pudieras ayudarme, te lo agradecere.
    Saludos, Juvit.

  9. Kodam PR: 0dijo:

    Excelente! Ya vere con que lo puedo fusionar. =)

  10. DeiMoS PR: 2dijo:

    Juvit, posiblemente tengas el PHP_SAFE_MODE ON con lo cual no puedas usar el la funcion exec();

  11. David PR: 0dijo:

    Como compruebo si el PHP_SAFE_MODE esta ON por tu ayuda gracias.

  12. DeiMoS PR: 2dijo:

    Simplemente subes al servidor un fichero llamado info.php (por ejemplo) con el siguiente contenido: ” < ?php phpinfo(); ?> ”
    Visualizas ese fichero y saldrá toda la información del componente php de tu servidor.

  13. David PR: 0dijo:

    YA comprobe con el archivo que dices y aparece off pero igual no me funciona que pasara sale:
    Warning: exec() [function.exec]: Cannot execute a blank command in /home/archivo/public_html/exec.php on line 2

    Warning: Invalid argument supplied for foreach() in /home/archivo/public_html/exec.php on line 3

    Por su ayuda gracias.

  14. DeiMoS PR: 2dijo:

    David, posiblemente no le estes pasando el parametro por navegador. Has escrito esto? exec.php?cmd=ls

Deja tu comentario

XHTML: Puedes usar las etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>