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?
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
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.
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
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.
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"
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'