Collegati a MySQL tramite la riga di comando senza la password di root


11

Sto creando uno script Bash per alcune attività. Una di queste attività è creare un DB MySQL all'interno dello stesso script bash. Quello che sto facendo in questo momento è la creazione di due variabili: una per il nome utente del negozio e l'altra per la password del negozio. Questa è la parte rilevante della mia sceneggiatura:

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

Ma ricevi sempre un errore che dice accesso negato per l'utente root senza NESSUNA PASSWORD, cosa sto facendo di sbagliato? Devo fare lo stesso per PostgreSQL.


Esegui il debug (-: prova echo "$MYSQL_PASS"prima di passarlo alla mysqllinea. Ha la password corretta?
KM.

Puoi accedere come al solito senza lo script?
qweet,

4
-h manca. Inoltre, non è una buona idea mettere le password su una riga di comando, poiché saranno visibili a tutti coloro che chiamano ps wwaux.
Nils,

Risposte:


23

Sia per MySQL che PostgreSQL è possibile specificare l'utente e la password nel file di configurazione locale. .my.cnf per MySQL e .pgpass per PostgreSQL. Questi file dovrebbero trovarsi nella tua directory home (cioè ~ / .my.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

Puoi avere una voce jolly qui, sostituendo qualsiasi campo per *******.

PS: NON SPECIFICARE MAI UNA PASSWORD SULLA LINEA DI COMANDO! Questo può essere perfettamente visibile con ps se il tuo sistema non è configurato per non mostrare i processi che appartengono ad altri utenti.

@thinice: se vuoi creare quei file davvero sicuri, dovresti fare:

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

In questo modo il file verrebbe creato con autorizzazioni sicure dall'inizio e nessun intercettatore avrebbe la possibilità di ottenere la password.

PostgreSQL rifiuterà comunque di utilizzare il file con autorizzazioni superiori a 0600.


1
Per mysql il client mysql è possibile puntare a un file di configurazione specifico con --defaults-extra-file=filename. Questo potrebbe essere utile se vuoi posizionarlo in un posto non standard o semplicemente creare un file temporaneo. Sospetto che sia un'opzione simile con PostgreSQL, ma non ne ho familiarità.
Zoredache,

1
E per amore dei pantaloncini di Happy Gilmore chmod quel file0600
magrezza

@kworr Ci proverò con certezza, ma il mio MySQL non inizia a modificare questi parametri su /etc/my.cnf :( non conoscevo la causa.
Riproverò

Non è /etc/my.cnf. Aggiornamento della risposta.
kworr,

@kworr Provo la tua soluzione ma non funziona affatto. Il DB è creato da vuoto e non appare in phpMyAdmin o in qualsiasi altro strumento GUI. Ho impostato la directory dei dati in /etc/my.cnf su datadir = / data / var / lib / mysql e ho impostato le autorizzazioni su 0755 su / data / var / lib / mysql e anche il proprietario su mysql: mysql, perché il database è vuoto ? dov'è il 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 

Questo farà il trucco Grazie


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

Come eseguo una riga di comando con una password sicura ?? usa l'editor di configurazione !!!

A partire da mysql 5.6.6 è possibile memorizzare la password in un file di configurazione e quindi eseguire comandi cli in questo modo ....

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

--login-path sostituisce le variabili ... host, user AND password. eccellente vero!



1
Grazie per la condivisione! C'è solo un gotcha da questo approccio. Il parametro --login-path deve essere il primo parametro della chiamata, altrimenti verrà visualizzato il messaggio "variabile sconosciuta" 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

assicurati di scrivere il tuo pass e che non sfugga

--defaults-extra-file = è una buona cosa (tm) (c)


1

Non inserire virgolette attorno alla password perché se lo fai le virgolette sono considerate parte della password.


0

Una domanda simile esiste su StackOverflow.

Per riassumere la mia risposta da lì.

Puoi export MYSQL_PWD=yourverysecretpassword.

L'aspetto positivo di questo metodo rispetto all'utilizzo di un file di configurazione è che non è necessario un file di configurazione separato per rimanere sincronizzato con lo script. Hai solo lo script da mantenere.

Non vi è alcun aspetto negativo di questo metodo.

La password non è visibile agli altri utenti sul sistema (sarebbe visibile se si trova sulla riga di comando). Le variabili di ambiente sono visibili solo all'utente che esegue il comando mysql e root.

La password sarà visibile anche a chiunque sia in grado di leggere lo script stesso, quindi assicurati che lo script stesso sia protetto. Questo non è in alcun modo diverso dalla protezione di un file di configurazione. Puoi comunque ottenere la password da un file separato se vuoi che lo script sia leggibile pubblicamente ( export MYSQL_PWD=$(cat /root/mysql_password)ad esempio). È ancora più semplice esportare una variabile che creare un file di configurazione.

Per esempio,

$ 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 */;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.