Conéctese a la línea de comando de MySQL sin necesidad de contraseña de root


11

Estoy construyendo un script Bash para algunas tareas. Una de esas tareas es crear una base de datos MySQL desde el mismo script bash. Lo que estoy haciendo ahora es crear dos vars: uno para el nombre de usuario de la tienda y el otro para la contraseña de la tienda. Esta es la parte relevante de mi script:

MYSQL_USER=root
MYSQL_PASS=mypass_goes_here

touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password="$MYSQL_PASS" < /tmp/script.sql
rm -rf /tmp/script.sql

Pero siempre aparece un error que dice que el acceso denegado para el usuario root sin CONTRASEÑA, ¿qué estoy haciendo mal? Necesito hacer lo mismo para PostgreSQL.


Haga un poco de depuración (-: intente echo "$MYSQL_PASS"antes de pasarlo a la mysqllínea. ¿Tiene la contraseña correcta?
KM.

¿Puedes iniciar sesión como siempre sin el script?
qweet

44
-h falta. Tampoco es una buena idea poner contraseñas en una línea de comandos, ya que serán visibles para todos los que llamen ps wwaux.
Nils

Respuestas:


23

Tanto para MySQL como PostgreSQL puede especificar su usuario y contraseña en el archivo de configuración local. .my.cnf para MySQL y .pgpass para PostgreSQL. Estos archivos deben estar en su directorio de inicio (es decir, ~ / .my.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

Puede tener una entrada comodín aquí, sustituyendo cualquier campo por *******.

PD: ¡NO ESPECIFIQUE NUNCA UNA CONTRASEÑA EN LA LÍNEA DE MANDO! Esto puede ser perfectamente visible con ps si su sistema no está configurado para no mostrar procesos que pertenecen a otros usuarios.

@thinice: si desea crear esos archivos realmente seguros, debe hacer lo siguiente:

umask 077
touch .my.new.config
umask 022 # or whatever was your default

De esta forma, el archivo se crearía con permisos seguros desde el principio y ningún intruso tendría la posibilidad de robar su contraseña.

PostgreSQL se negará a usar el archivo con permisos superiores al 0600 de todos modos.


1
Para mysql, el cliente mysql puede apuntar a un archivo de configuración específico con --defaults-extra-file=filename. Esto puede ser útil si desea colocarlo en un lugar no estándar, o simplemente crear un archivo temporal. Se sospecha que es una opción similar con PostgreSQL, pero no estoy familiarizado con eso.
Zoredache

1
Y por amor a los pantalones cortos de 0600
Happy Gilmore

@kworr Ya lo intentaré, pero mi MySQL no comienza a cambiar estos parámetros en /etc/my.cnf :( no sabía la causa. Intentaré nuevamente más tarde
ReynierPM

No es el /etc/my.cnf. Actualizando respuesta.
kworr

@kworr Intento su solución pero no funciona en absoluto. La base de datos se crea vacía y no aparece en phpMyAdmin ni en ninguna otra herramienta GUI. Configuré el directorio de datos en /etc/my.cnf en datadir = / data / var / lib / mysql y configuré los permisos en 0755 en / data / var / lib / mysql y también el propietario de mysql: mysql, por qué la base de datos está vacía ? ¿Dónde está el problema?
ReynierPM

2
MYSQL_USER="root"
MYSQL_PASSWORD="PASSWORD"
DBNAME="DB_NAME"

mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "CREATE DATABASE $DBNAME;" 2> /tmp/error1

STATUS=$? 
if [ $STATUS -eq 0 ];
then 
    echo -e "Database '$DBNAME' is created"
elif (grep -i "^ERROR 1007" /tmp/error1 > /dev/null);
then
    echo -e "Database '$DBNAME' already exists"
else
    echo -e "Failed to create database '$DBNAME'"
fi

rm -r /tmp/error1 

Esto hará el truco Gracias


2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

¿Cómo ejecuto una línea de comando con una contraseña segura? usa el editor de configuración !!!

A partir de mysql 5.6.6 puede almacenar la contraseña en un archivo de configuración y luego ejecutar comandos cli como este ...

mysql --login-path=storedPasswordKey ....

--login-path reemplaza las variables ... host, usuario Y contraseña. excelente derecho!



1
¡Gracias por compartir! Solo hay un problema con este enfoque. El parámetro --login-path tiene que ser el primer parámetro de la llamada o de lo contrario obtendrá el mensaje "variable desconocida 'login-path = local'".
André Augusto

1
MYSQL_USER="root"
MYSQL_PASS="mypass_goes_here"

touch /tmp/$PROY.sql && echo "CREATE DATABASE $DB_NAME;" > /tmp/script.sql
mysql --user=$MYSQL_USER --password=$MYSQL_PASS < /tmp/script.sql
rm -rf /tmp/script.sql

asegúrese de escribir su pase y no se escape

--defaults-extra-file = es algo bueno (tm) (c)


1

No ponga comillas alrededor de la contraseña porque si lo hace, las citas se consideran parte de la contraseña.


0

Pregunta similar existe en StackOverflow.

Para resumir mi respuesta desde allí.

Puede export MYSQL_PWD=yourverysecretpassword.

La ventaja de este método sobre el uso de un archivo de configuración es que no necesita un archivo de configuración separado para mantenerse sincronizado con su script. Solo tiene que mantener el script.

No hay inconveniente en este método.

La contraseña no es visible para otros usuarios en el sistema (sería visible si está en la línea de comando). Las variables de entorno solo son visibles para el usuario que ejecuta el comando mysql y root.

La contraseña también será visible para cualquiera que pueda leer el script en sí, así que asegúrese de que el script esté protegido. Esto no es diferente a proteger un archivo de configuración. Todavía puede obtener la contraseña de un archivo separado si desea que el script se pueda leer públicamente ( export MYSQL_PWD=$(cat /root/mysql_password)por ejemplo). Todavía es más fácil exportar una variable que construir un archivo de configuración.

P.ej,

$ export MYSQL_PWD=xoF3mafn5Batxasdfuo
$ mysqldump -u root mysql | head
-- MySQL dump 10.13  Distrib 5.6.23, for Linux (x86_64)
--
-- Host: localhost    Database: mysql
-- ------------------------------------------------------
-- Server version   5.6.23
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.