2008-10-23 6 views
11

Estoy trabajando con una consulta MySQL que escribe en un archivo de salida. Ejecuto esta consulta una vez cada día o dos y, por lo tanto, quiero poder eliminar el archivo de salida sin tener que recurrir a su o sudo. La única forma en que puedo pensar en hacer que eso suceda es tener el archivo de salida escrito como propiedad de alguien que no sea el usuario de mysql. es posible?¿Cómo puedo tener archivos de escritura MySQL como un usuario diferente?

Editar: No estoy redirigiendo la salida a un archivo, estoy usando la parte INTO OUTFILE de una consulta de selección para enviar a un archivo.

Si ayuda:

 
mysql --version 
mysql Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (x86_64) using readline 5.2 

Respuesta

10

El archivo de salida se crea mediante el proceso mysqld, no por el proceso del cliente. Por lo tanto, el archivo de salida debe ser propiedad del uid y del gid del proceso mysqld.

Puede evitar tener que sudo para acceder al archivo si accede desde un proceso bajo un uid o gid que puede acceder al archivo. En otras palabras, si mysqld crea archivos propiedad de uid y gid "mysql"/"mysql", entonces agregue su propia cuenta al grupo "mysql". Entonces debería poder acceder al archivo, siempre que el modo de permiso del archivo incluya acceso grupal.

Editar:

va a eliminar un archivo en/tmp, con un modo de permiso de directorio rwxrwxrwt. El bit adhesivo ('t') significa que puede eliminar archivos solo si su uid es el mismo que el propietario del archivo, independientemente de los permisos en el archivo o el directorio.

Si guarda su archivo de salida en otro directorio que no tiene el conjunto de bits adhesivos, debería poder eliminar el archivo normalmente.

Leer este extracto de la página del manual para pegajosas (8):

DIRECTORIES PEGAJOSOS

un directorio cuyo ` 'se fija poco pegajosa se convierte en un directorio sólo de adición, o, más exactamente, un directorio en el que la eliminación de archivos está restringida. Un archivo en un directorio fijo solo puede ser eliminado o renombrado por un usuario si el usuario tiene permiso de escritura para el directorio y el usuario es el propietario del archivo, el propietario del directorio o el superusuario. Esta característica se aplica de manera útil a directorios como/tmp, que deben poderse escribir públicamente, pero deben denegar a los usuarios la licencia para eliminar arbitrariamente o cambiar el nombre de los archivos de los demás.

+1

El archivo es propiedad al "mysql"/"mysql" y modded 666. He añadido me he dirigido al grupo mysql y aún no puedo eliminarlo. –

+0

¿Cuáles son las propiedades y permisos en el directorio en el que reside el archivo? –

+0

Creo que * lo que Bill está diciendo es que debe tener permiso de escritura en el directorio contenedor para poder eliminar un archivo en UNIX (b/c actualiza la lista de directorios). Así que "chgrp mysql" el dir y "chmod ug + rwX" para darle a su usuario de mysql-group perms de escritura en el directorio. – joelhardi

1

Si tiene otro usuario ejecute la consulta desde cron, se creará el archivo como ese usuario.

5

No se usa la sintaxis "SELECCIONAR EN INGRESO", no.

Debe ejecutar la consulta (es decir, el cliente) como otro usuario y redirigir la salida. Por ejemplo, editar el crontab para ejecutar el siguiente comando cuando lo desee:

mysql db_schema -e 'SELECT col,... FROM table' > /tmp/outfile.txt 

que creará /tmp/outfile.txt como el usuario que es crontab que ha añadido el comando a.

+0

Tenga en cuenta que las tuberías arrojarán resultados diferentes en comparación con 'en el archivo de salida '. Por ejemplo, la tubería incluye nombres de columna como primera fila, NULL en lugar de \ N, etc. (en Ubuntu. Los detalles pueden variar en otros sistemas operativos) –

1

acabo de hacer

sudo gedit /etc/apparmor.d/usr.sbin.mysqld 

y añadir

/var/www/codeigniter/assets/download/* w, 

y

sudo service mysql restart 

Y eso es todo, no puedo hacer fácilmente SELECT INTO OUTFILE cualquier nombre de archivo

Cuestiones relacionadas