web-dev-qa-db-fra.com

Comment se connecter automatiquement à mysql dans les scripts shell?

J'ai un serveur mysql avec un mot de passe root vide. Je veux exécuter des instructions SQL dans des scripts Shell sans spécifier le mot de passe comme ceci:

config.sh:

MYSQL_ROOT="root"
MYSQL_PASS=""

mysql.sh

source config.sh
mysql -u$MYSQL_ROOT -p$MYSQL_PASS -e "SHOW DATABASES"

Comment puis-je exécuter automatiquement ce SQL dans Shell avec l'option -p et un mot de passe vide?

25
KeepZero

Essaye ça:

if [ $MYSQL_PASS ]
then
  mysql -u "$MYSQL_ROOT" -p"$MYSQL_PASS" -e "SHOW DATABASES"
else
  mysql -u "$MYSQL_ROOT" -e "SHOW DATABASES"
fi
10
Diego Basch

Des moyens alternatifs pour écrire ces options.

Tu peux écrire

mysql -u "$MYSQL_ROOT" -p "$MYSQL_PASS" -e "SHOW DATABASES"

passer des chaînes vides comme arguments séparés. Votre commentaire ci-dessous indique que le client demandera quand même un mot de passe. Probablement, il interprète l'argument vide comme un nom de base de données et non comme un mot de passe. Vous pouvez donc essayer ce qui suit:

mysql --user="$MYSQL_ROOT" --password="$MYSQL_PASS" -e "SHOW DATABASES"

Au moins sur mon système, toutefois, si vous définissez MYSQL_PASS à "" dans ce cas, le client tente de se connecter sans aucun mot de passe. Donc, s'il y a une différence entre un mot de passe vide et aucun mot de passe, je ne connais pas le moyen de passer le premier en ligne de commande.

fichier .my.cnf

Mais même s'il y a un moyen, je vous suggère quand même d'utiliser un fichier ~/.my.cnf à la place. Les arguments de la ligne de commande sont probablement inclus dans une liste de processus générée par ps -A -ocmd, afin que les autres utilisateurs puissent les voir. Le fichier .my.cnf, en revanche, ne peut (et devrait) être rendu lisible que par vous (en utilisant chmod 0600 ~/.my.cnf), et sera utilisé automatiquement. Avez-ce fichier inclure les lignes suivantes:

[client]
user=root
password=

Ensuite, un simple mysql -e "SHOW DATABASES" suffira, car le client obtiendra ses informations d'identification à partir de ce fichier.

Voir 6.1.2.1. Instructions pour les utilisateurs finaux concernant la sécurité des mots de passe pour les différentes manières de fournir un mot de passe, ainsi que leurs avantages et inconvénients respectifs. Voir 4.2.3.3. Utilisation de fichiers d'options pour des informations générales sur ce fichier .my.cnf

39
MvG

Comme suggéré par MvG (recommandé dans le manuel MySQL 4.2.2 connexion et 6.1.2.1 consignes de sécurité ), vous devez utiliser un fichier. Le mot de passe sur la ligne de commande peut être dangereux car ps peut le montrer à d'autres utilisateurs. Le fichier ne doit pas obligatoirement être .my.cnf, il peut s'agir d'un fichier d'options ad-hoc pour votre script dans un fichier temporaire:

OPTFILE="$(mktemp -q --tmpdir "${inname}.XXXXXX")$"
trap 'rm -f "$OPTFILE"' EXIT
chmod 0600 "$OPTFILE"
cat >"$OPTFILE" <<EOF
[client]
password="${MYSQL_PASS}"
EOF
mysql --user="$MYSQL_ROOT" --defaults-extra-file="$OPTFILE" -e "SHOW DATABASES"

Les premières lignes créent un fichier temporaire sécurisé, puis définissez les options puis utilisez-le . Trap vous protégera de la forme OPTFILE qui traîne en cas d’interruption.

13
marco

Voici un petit script bash que vous pouvez utiliser pour obtenir un shell très rapidement

Il ouvre un shell afin que vous puissiez exécuter manuellement des requêtes. Très pratique.

  #!/bin/bash
  DB_USER='your_db_username'
  DB_PASS='your_password'
  DB='database_name'
  echo 'logging into db $DB as $DB_USER'
  mysql -u "$DB_USER" --password="$DB_PASS" --database="$DB"
9
med116

Dans les distributions Debian GNU/Linux, il existe un fichier appelé /etc/mysql/debian.cnf. Vous ne devez pas créer un autre fichier avec les informations d'identification MySQL root.

# Put in your .bashrc
alias mysql='mysql --defaults-file=/etc/mysql/debian.cnf'
alias mysqldump='mysqldump --defaults-file=/etc/mysql/debian.cnf'
1
Valerio Bozz