Connectez-vous à la ligne de commande MySQL Trough sans avoir besoin d'un mot de passe root

11

Je construis un script Bash pour certaines tâches. L'une de ces tâches consiste à créer une base de données MySQL à partir du même script bash. Ce que je fais en ce moment est de créer deux vars: un pour le nom d'utilisateur du magasin et l'autre pour le mot de passe du magasin. Ceci est la partie pertinente de mon 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

Mais obtenez toujours une erreur disant que l'accès est refusé à l'utilisateur root avec NO PASSWORD, qu'est-ce que je fais mal? Je dois faire de même pour PostgreSQL.

ReynierPM
la source
Faites un débogage (-: Essayez echo "$MYSQL_PASS"avant de le passer à la mysqlligne. At-il le bon mot de passe?
KM.
Pouvez-vous vous connecter comme d'habitude sans le script?
qweet
4
-h est manquant. Ce n'est pas non plus une bonne idée de mettre des mots de passe sur une ligne de commande, car ils seront visibles pour tous ceux qui appellent ps wwaux.
Nils

Réponses:

23

Pour MySQL et PostgreSQL, vous pouvez spécifier votre utilisateur et votre mot de passe dans le fichier de configuration local. .my.cnf pour MySQL et .pgpass pour PostgreSQL. Ces fichiers doivent se trouver dans votre répertoire personnel (c'est-à-dire ~ / .my.cnf).

.my.cnf:

[mysql]
user=user
password=password

.pgpass:

host:port:database:user:password

Vous pouvez avoir une entrée générique ici, en remplaçant n'importe quel champ par *******.

PS: NE SPÉCIFIEZ JAMAIS UN MOT DE PASSE SUR LA LIGNE DE COMMANDE! Cela peut être parfaitement visible avec ps si votre système n'est pas configuré pour ne pas afficher les processus appartenant à d'autres utilisateurs.

@thinice: Si vous voulez créer ces fichiers vraiment sécurisés, vous devez faire:

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

De cette façon, le fichier serait créé avec des autorisations sécurisées dès le départ et aucune écoute indiscrète n'aurait la moindre chance de récupérer votre mot de passe.

PostgreSQL refusera de toute façon d'utiliser le fichier avec des autorisations supérieures au 0600.

kworr
la source
1
Pour mysql le client mysql, vous pouvez pointer vers un fichier de configuration spécifique avec --defaults-extra-file=filename. Cela peut être utile si vous souhaitez le placer dans un endroit non standard ou simplement créer un fichier temporaire. Est suspect que c'est une option similaire avec PostgreSQL, mais je ne connais pas cela.
Zoredache
1
Et pour l'amour des shorts de gilmore heureux chmod ce fichier0600
thinice
@kworr Je vais essayer, mais mon MySQL ne commence pas à changer ces paramètres sur /etc/my.cnf :( je ne connaissais pas la cause. Je vais réessayer plus tard
ReynierPM
Ce n'est pas le /etc/my.cnf. Mise à jour de la réponse.
kworr
@kworr J'essaie votre solution mais ne fonctionne pas du tout. La base de données est créée par vide et n'apparaît pas dans phpMyAdmin ou tout autre outil GUI. J'ai défini le répertoire de données dans /etc/my.cnf sur datadir = / data / var / lib / mysql et défini les autorisations sur 0755 dans / data / var / lib / mysql et également le propriétaire sur mysql: mysql, pourquoi la base de données est vide ? où est le problème?
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 

Cela fera l'affaire Merci

Abhijeet Kasurde
la source
2
mysql_config_editor set --login-path=storedPasswordKey --host=localhost --user=root --password

Comment exécuter une ligne de commande avec un mot de passe sécurisé ?? utilisez l'éditeur de configuration !!!

Depuis mysql 5.6.6, vous pouvez stocker le mot de passe dans un fichier de configuration, puis exécuter des commandes cli comme celle-ci ....

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

--login-path remplace les variables ... hôte, utilisateur ET mot de passe. excellent droit!

Artistan
la source
1
Merci d'avoir partagé! Il n'y a qu'un seul problème avec cette approche. Le paramètre --login-path doit être le premier paramètre de l'appel, sinon vous obtiendrez le message "variable inconnue '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

assurez-vous comment vous écrivez votre laissez-passer et il ne s'échappe pas

--defaults-extra-file = est une bonne chose (tm) (c)

GioMac
la source
1

Ne mettez pas de guillemets autour du mot de passe, car si vous le faites, les guillemets sont considérés comme faisant partie du mot de passe.

John Gardeniers
la source
0

Une question similaire existe sur StackOverflow.

Pour résumer ma réponse à partir de là.

Tu peux export MYSQL_PWD=yourverysecretpassword.

L'avantage de cette méthode par rapport à l'utilisation d'un fichier de configuration est que vous n'avez pas besoin d'un fichier de configuration distinct pour rester synchronisé avec votre script. Vous n'avez que le script à maintenir.

Il n'y a aucun inconvénient à cette méthode.

Le mot de passe n'est pas visible pour les autres utilisateurs du système (il serait visible s'il se trouve sur la ligne de commande). Les variables d'environnement ne sont visibles que par l'utilisateur exécutant la commande mysql et root.

Le mot de passe sera également visible par toute personne pouvant lire le script lui-même, alors assurez-vous que le script lui-même est protégé. Ce n'est en rien différent de la protection d'un fichier de configuration. Vous pouvez toujours obtenir le mot de passe à partir d'un fichier séparé si vous souhaitez que le script soit publiquement lisible ( export MYSQL_PWD=$(cat /root/mysql_password)par exemple). Il est toujours plus facile d'exporter une variable que de créer un fichier de configuration.

Par exemple,

$ 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 */;
chutz
la source