jueves, enero 27, 2011

"La query que tumba la máquina".

Hace unos años publiqué un artículo llamado "PL/SQL y ejecuciones en host" en el que describía el paso a paso para poder, desde PL/SQL, ejecutar código en el sistema operativo.

Oracle no permite que los procedimientos y funciones puedan acceder al host, pero sí permite llamadas a funciones externas implementadas con C o PASCAL, y redireccionadas como librerías mediante un objeto library.

Mi intención inicial fue la de crear un procedimiento PL/SQL que realizara un backup en caliente del servidor, realizase un export, import, o cualquier otra invocación a un ejecutable residente en el sistema operativo.

Hoy he visto una configuración similar en una base de datos en un entorno de producción, que realizan la misma implementación pero mediante una función.


create or replace
FUNCTION sysrun (syscomm IN VARCHAR2)
  RETURN BINARY_INTEGER
  AS LANGUAGE C
  NAME "sysrun"
  LIBRARY shell_lib
  PARAMETERS(syscomm string);


De este modo, la función retorna un 0 si la llamada al SHELL_LIB se ha ejecutado correctamente, o un número si ha habido un error.

Hice esta prueba, y pude constatar un mito: La consulta que tumba el servidor existe!!.

SQL> select sysrun('sudo reboot') from dual;

Broadcast message from root (Thu Jan 27 13:16:34 2011):

The system is going down for reboot NOW!


SYSTEM.SYSRUN('SUDOREBOOT')
---------------------------
                          0

No hay comentarios:

Amazon