Si inicio sesión con la contraseña de root en mi casilla, simplemente puedo escribir
mysqldump --all-bases de datos y obtendré el "Dump" esperado.
Configuré un trabajo en cron.daily para ejecutarlo y volcarlo en una unidad de respaldo. El problema que tengo es que, aunque el usuario se está ejecutando como root, recibo el siguiente mensaje
mysqldump: Error obtenido: 1045: Acceso denegado para el usuario 'root' @ 'localhost' (usando la contraseña: NO)
cuando intentas conectarte. Yo no quiero codificar la contraseña de root base de datos MySQL en el guión (que lo haría).
Teniendo en cuenta que solo puedo escribir "mysqldump" en la línea de comando en mi shell bash, debe haber alguna forma de moverse usando el parámetro -u. Ya tengo #! / Bin / bash en la parte superior del script.
¿Qué me estoy perdiendo aquí para que esto no pida la contraseña de root a la base de datos?
La seguridad no debe hacerse a través de la oscuridad. Si temes que alguien tenga acceso a tu cuenta de root, no importa si la contraseña de mysql de root está almacenada en el script, ya que tienes todos tus datos disponibles en volcados de mysql o archivos de base de datos. Entonces, la verdadera pregunta es ¿qué estás tratando de proteger?
Si no desea que otros obtengan una contraseña que les permita cambiar los datos en su base de datos, deberá crear un usuario con los permisos adecuados .
Si no desea que esa cuenta mysql sea vista por ninguna cuenta local, excepto los permisos de archivos del conjunto raíz en ese script para que sean 0700 y el propietario de la raíz.
fuente
Su uso de shell puede hacerlo porque tiene un shell para ejecutarlo, es decir, cuando inicia sesión, todos los scripts de shell en su perfil se ejecutan.
Cron no tiene tales lujos. Cuando inicia sesión (como root), iniciará sesión con un shell predeterminado. Esto evita que alguien inicie sesión de forma remota, pero también significa que no se ejecutan scripts de inicio de sesión automático.
Puede configurar un shell para que se ejecute cron, editar el crontab y agregar las variables SHELL y HOME, por ejemplo.
si no están configurados, cron se ejecutará con el shell y el directorio de inicio especificados en / etc / passwd (que probablemente no sean nada, posiblemente / bin / sh).
Si desea ver el entorno en el que se ejecuta cron, agregue un trabajo cron que exporta env a un archivo, por ejemplo:
fuente
Si el script es ejecutado por root, puede crear un archivo /root/.my.cnf con permisos 600 y los siguientes contenidos:
(donde ingresas tu nombre de usuario y contraseña de MySQL, por supuesto).
Este archivo será leído automáticamente por cualquier herramienta de línea de comandos mysql, si se ejecuta como root. Ya no es necesario proporcionarlo en la línea de comandos. Los 600 permisos lo protegen contra miradas indiscretas.
fuente
Cron puede ser muy frustrante para depurar. Cuando se ejecutan los trabajos cron, no tienen un entorno establecido como el que das por sentado con un shell.
Consejos para cron:
Si su usuario root puede hacerlo desde el shell, cron debería poder hacerlo. Asegúrese de especificar explícitamente el archivo de configuración para usar en la línea de comandos.
fuente
Aunque varias de estas respuestas son útiles, varias son confusas porque el usuario raíz de Unix y el usuario raíz de mysql no son iguales y, básicamente, no tienen otra relación que no sea que ambos usan el nombre de usuario 'root'. Tal vez eso sea obvio, pero parece que algunas respuestas combinan los dos.
Lo que podría ser una opción útil (¿tal vez existe?) Para mysqld sería permitir que los programas cliente como mysql o mysqldump, etc., que se ejecutan como raíz de Unix accedan a root @ localhost de mysqld sin una contraseña sin tener que almacenar la contraseña de root @ localhost (mysql) en un archivo my.cnf o similar.
Sé que eso pone un poco nervioso, pero el razonamiento es que cualquiera que se ejecute como unix root local (para el servidor mysqld) puede eludir la seguridad de mysqld de todos modos, con bastante facilidad. Y tener un my.cnf con la contraseña de root de mysqld 7x24 o incluso crear / eliminar un my.cnf con la contraseña de root de mysql (¿de dónde viene esa contraseña?) Sobre la marcha (por ejemplo, hacer un mysqldump) me pone nervioso.
Requeriría algo de infraestructura y pensamiento porque uno tendría que confiar en mysql / mysqldump / etc para transmitir a mysqld que realmente cree que está siendo ejecutado por una cuenta raíz local de Unix.
Pero, por ejemplo, limitar solo el socket unix de mysqld, sin TCP, podría ayudar, al menos como una opción muy recomendada de esta opción. Eso podría establecer que el cliente se ejecuta localmente, aunque eso probablemente no sea suficiente. Pero podría ser el comienzo de una idea. Quizás enviar un descriptor de archivo a través de un zócalo Unix podría ser otra pieza (busque en Google si eso suena como una locura).
PD No, no voy a tratar de hacer una lluvia de ideas aquí sobre cómo algo de eso podría funcionar en un sistema operativo no Unix, aunque la idea probablemente se traduzca en otros sistemas operativos.
fuente
/root/.my.cnf
con los permisos adecuados resuelve perfectamente el problema.