Ver la versión completa : [Ayuda] Ejecutar comando en Linux desde MySQL con UDF programada en C
Buenas,
Abri un hilo en la seccion equivocada hace unos dias preguntando algo parecido :lamer:, pero bueno, como ahora es más especifico abro otro, espero que a nedie le importe :).
Os pongo en situacion:
Quiero ejecutar una aplicacion (pasandole argumentos) programada en Java cada vez que haga un insert de unas caracteristicas muy concretas, para ello utilizaria un trigger que llamase a una funcion definida (UDF)...el problema viene ahi:
Programo en C la funcion
..................
..................
char *metaphon(UDF_INIT *initid __attribute__((unused)),
UDF_ARGS *args, char *result, unsigned long *length,
char *is_null, char *error __attribute__((unused)))
{
system("mkdir /tmp/hola");
return("mira que bien");
}
..................
..................
..................
Compilo:
gcc -shared -I/usr/include/mysql/ -o libexeprog.so libexeprog.c
Copio al directorio necesario:
cp libexeprog.so /usr/lib/mysql/plugin/
Creo la funcion en MySQL:
CREATE FUNCTION metaphon RETURNS STRING SONAME 'libexeprog.so';
Y la ejecuto:
SELECT metaphon("hola!");
Lo de "hola!" es por pasale ya que el ejemplo que he modificado así lo pide.
Entonces me devuelve "mira que bien", pero se pasa por el forro el mkdir /tmp/hola.
Nose que probar...MySQL lo estoy ejecutando como root, en /tmp todos los usuarios tienen persmisos...he hecho un programita simple en C con system("mkdir /tmp/hola"); y esa funcion va perfectamente...
He probado esta libreria:
http://www.mysqludf.org/lib_mysqludf_sys/index.php (http://http://www.mysqludf.org/lib_mysqludf_sys/index.php)
Y hace lo mismo que mi funcion, es decir: nada :(
A ver si alguien tiene alguna idea...la distro de Linux es ubuntu...
:brindis::brindis:
Host¡a, pues no se me ocurre que puede ser, ¿quizá mysql solo ve dentro de su directorio de trabajo (aunque no me suena que en ubuntu corra en un chroot o algo asi) y ese directorio se está creando dentro de /var/mysql o similar?
Host¡a, pues no se me ocurre que puede ser, ¿quizá mysql solo ve dentro de su directorio de trabajo (aunque no me suena que en ubuntu corra en un chroot o algo asi) y ese directorio se está creando dentro de /var/mysql o similar?
Queva tio, si el problema es que ese directorio no se esta creando en ningun lado y si pongo directamente el nombre del directorio para que lo ponga donde le de la gana directamente no lo crea (lo he buscado con un find / -name nombre).
Y de chroot nada, lo tengo instalado y todo ok...
:brindis::brindis:
< - >
Igual hay alguna restricción para usar comandos de sistema a través de system() (root de MySQL <> root del sistema).
¿Has probado a crear el directorio con mkdir(), a través de C, en vez de delegar en system()?
No conociaesa funcion, voy a probar :)
Edito: Toma ya! con la funcion mkdir funciona, a ver si es que necesito pasarle tambien el parametro de los permisos al system...
mkdir("/tmp/caracola",0777);
Reedito:
Con "system("mkdir /tmp/caracola", 0777);" no compila
Y con system("mkdir /tmp/caracola 0777"); no hace nada
Cosa mas rara...grrr
JoJo_ReloadeD
10/12/2009, 13:48
Eso se esta ejecutando con el usuario mysql, mira que tenga permisos para crear ese directorio... aunque es /tmp...
we, haz un su - mysql y trata de ejecutar dicho comando para descartarlo. Si fuera eso con un sudoer lo tienes hecho.
Si no fuera eso, depura la salida del comando system, aunque sea recogiendo el *char que devuelve y sacandolo por el return...
Eso se esta ejecutando con el usuario mysql, mira que tenga permisos para crear ese directorio... aunque es /tmp...
we, haz un su - mysql y trata de ejecutar dicho comando para descartarlo. Si fuera eso con un sudoer lo tienes hecho.
Si no fuera eso, depura la salida del comando system, aunque sea recogiendo el *char que devuelve y sacandolo por el return...
He arrancado mysql como root y no rula, adeas de que usando la funcion mkdir de C si que va...por lo que descartaria el rollo de permisos:
root 5075 0.0 0.0 2932 688 pts/0 S+ 14:33 0:00 logger -t mysqld -p daemon.error
Tiene que ser algun error que de la funcion system.... ver como lo debuggeo por que en C estoy bastante pez...
He probado con:
char *lola = system("mkdir /tmp/gramola");
return(*lola);
Pero compilando me explota:
libexeprog.c: In function ‘metaphon’:
libexeprog.c:89: warning: initialization makes pointer from integer without a cast
Voy a comer, luego googleo a ver como conio se hace jejeje.
Gracias tios :D :D
JoJo_ReloadeD
10/12/2009, 14:31
He arrancado mysql como root y no rula, adeas de que usando la funcion mkdir de C si que va...por lo que descartaria el rollo de permisos:
root 5075 0.0 0.0 2932 688 pts/0 S+ 14:33 0:00 logger -t mysqld -p daemon.error
Tiene que ser algun error que de la funcion system.... ver como lo debuggeo por que en C estoy bastante pez...
He probado con:
char *lola = system("mkdir /tmp/gramola");
return(*lola);
Pero compilando me explota:
libexeprog.c: In function ‘metaphon’:
libexeprog.c:89: warning: initialization makes pointer from integer without a cast
Voy a comer, luego googleo a ver como conio se hace jejeje.
Gracias tios :D :D
Ya veo, es que system devuelve un int, en vez de un char*, pensaba que era como el exec de php. Tonces poco podras sacar de ahi.. en fin, mira a ver.
Prueba a hacer lo siguiente, con esto tendrás dos ficheros de texto con la salida y errores del comando mkdir. Puede ser problema de permisos de directorios en mysql.
system("mkdir /tmp/hola 1> out.txt 2> err.txt");
Esto tiene que funcionar, saca el directorio:
system ("ls > listado.txt");
Ya veo, es que system devuelve un int, en vez de un char*, pensaba que era como el exec de php. Tonces poco podras sacar de ahi.. en fin, mira a ver.
jejeje pues vaya como esta el tema... gracias igualmente :)
Prueba a hacer lo siguiente, con esto tendrás dos ficheros de texto con la salida y errores del comando mkdir. Puede ser problema de permisos de directorios en mysql.
system("mkdir /tmp/hola 1> out.txt 2> err.txt");
Esto tiene que funcionar, saca el directorio:
system ("ls > listado.txt");
Imposible tio, no me crea ningun txt con la salida del comando mkdir.... es como si no lo ejecutase...
http://forums.mysql.com/read.php?118,215809,215809
Sigue el hilo, igual llegas a una conclusión útil, pero en principio parece que es algo de la forma de funcionar de tu modulo, a la segunda respuesta del sys_exec, dicen que funciona perfectamente con su ejemplo... bueno resumiendo que igual te sirve xD
Gracias tio, estaba siguiendo el hilo...de hecho estoy leyendo una entrada en el blog del autor de esa libreria en la que explica como instalarla y testearla...estoy en el extremo de instalar todo en otro pc... me tiene muy mosqueado esto... :mad: como no rule esta noche meto una suse :lamer:.
Lo unico que varia con respecto a su instalacion es que el directorio donde yo meto la libreria es "/usr/lib/mysql/plugin/" en lugar de "/usr/lib/" pero eso deberia de dar igual por que al hacer el "CREATE FUNCTION..." lo encuentra y crea la funcion correctamente.
:brindis::brindis:
Edito: distinto pc misma mielda... voy a desinstalar el mysql de ubuntu y voy a bajarlo de mysql.com...
< - >
SOLUCIONADO
El puñetero apparmor (aplicacion desarrollada por novell...http://es.wikipedia.org/wiki/AppArmor).
Parado el proceso ya rula todo guay :D :D :D :D menudo para descubrir esa chorrada pfff
Bueno espero que le sirva a alguien mas adelante :)
Documentacion en:
http://bernardodamele.blogspot.com/2009/01/command-execution-with-mysql-udf.html
http://bernardodamele.blogspot.com/2009/01/mysql-udf-and-apparmor.html
Un saludo y gracias a todos por la ayuda! :D
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.