Lorsque j'ai essayé d'exécuter la commande suivante sur MySQL à partir de Terminal:
mysql -u $user -p$password -e "statement"
L'exécution fonctionne comme prévu, mais un avertissement est toujours émis:
Avertissement: L'utilisation d'un mot de passe sur l'interface de ligne de commande peut être non sécurisée.
Cependant, je dois effectuer la déclaration ci-dessus en utilisant une variable d'environnement ($password
) qui stocke mon mot de passe, car je veux exécuter la commande de manière itérative dans un script bash à partir de Terminal. et me forcer à entrer mon mot de passe 50 ou 100 fois dans un seul script. Alors voici ma question:
Est-il possible de supprimer l'avertissement? La commande fonctionne correctement, comme je l’ai dit, mais la fenêtre devient très désordonnée lorsque je boucle et exécute la commande 50 ou 100 fois.
Dois-je obéir au message d'avertissement et ne PAS écrire mon mot de passe dans mon script? Si tel est le cas, dois-je taper mon mot de passe chaque fois que le guide m'y oblige?
Exécuter man mysql
n'aide pas, dit seulement
--show-warnings
Faire en sorte que des avertissements soient affichés après chaque instruction, le cas échéant. Cette option s'applique aux modes interactif et batch.
et ne mentionne rien sur la façon de désactiver la fonctionnalité, si je ne manque pas quelque chose.
Je suis sous OS X 10.9.1 Mavericks et j'utilise MySQL 5.6 depuis homebrew.
Si votre version de client/serveur MySQL est 5.6.x, une façon d'éviter le message WARNING utilise les outils mysql_config_editor:
mysql_config_editor set --login-path=local --Host=localhost --user=username --password
Ensuite, vous pouvez utiliser dans votre script Shell:
mysql --login-path=local -e "statement"
Au lieu de:
mysql -u username -p pass -e "statement"
J'utilise quelque chose comme:
mysql --defaults-extra-file=/path/to/config.cnf
ou
mysqldump --defaults-extra-file=/path/to/config.cnf
Où config.cnf contient:
[client]
user = whatever
password = whatever
Host = whatever
Cela vous permet d'avoir plusieurs fichiers de configuration - pour différents serveurs/rôles/bases de données. Utiliser ~/.my.cnf ne vous permettra d’avoir qu’un seul jeu de configuration (bien que cela puisse être un jeu utile de valeurs par défaut).
Si vous utilisez une distribution basée sur Debian et que vous utilisez root, vous pouvez ignorer ce qui précède et utiliser simplement /etc/mysql/debian.cnf pour y accéder ...:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
Une méthode pratique (mais également peu sûre) consiste à utiliser:
MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
Notez que la documentation officielle le déconseille.
Voir 6.1.2.1 Instructions pour les utilisateurs finaux en matière de sécurité par mot de passe (Manuel Mysql pour la version 5.6) :
Stockage de votre mot de passe dans la variable d'environnement
MYSQL_PWD
Cette méthode de spécification de votre mot de passe MySQL doit être considérée extrêmement non sécurisée _ et ne doit pas être utilisée. Certaines versions de ps incluent une option permettant d’afficher l’environnement des processus en cours. Sur certains systèmes, si vous définissez
MYSQL_PWD
, votre mot de passe est exposé à tout autre utilisateur exécutant ps. Même sur les systèmes dépourvus d'une telle version de ps, il est déconseillé de supposer qu'il n'existe aucune autre méthode permettant aux utilisateurs d'examiner les environnements de processus.
Si vous souhaitez utiliser un mot de passe dans la ligne de commande, j'ai constaté que cela fonctionne pour filtrer le message d'erreur spécifique:
mysqlcommand 2>&1 | grep -v "Warning: Using a password"
En gros, il redirige l'erreur standard vers la sortie standard et utilise grep pour supprimer toutes les lignes correspondant à "Avertissement: utilisation d'un mot de passe".
De cette façon, vous pouvez voir toute autre sortie, y compris les erreurs. J'utilise ceci pour divers scripts Shell, etc.
Voici comment j'ai obtenu mon script bash pour mes sauvegardes quotidiennes de la base de données mysqldump afin de fonctionner de manière plus sécurisée. C'est une extension de la réponse géniale de Cristian Porta.
Commencez par utiliser mysql_config_editor (fourni avec mysql 5.6+) pour configurer le fichier de mots de passe chiffré. Supposons que votre nom d'utilisateur est "utilisateur_bd". Exécuter à partir de l'invite du shell:
mysql_config_editor set --login-path=local --Host=localhost --user=db_user --password
Il demande le mot de passe. Une fois que vous l'avez entré, l'utilisateur/le passe sont enregistrés cryptés dans votre home/system_username/.mylogin.cnf
Bien sûr, remplacez "nom_système" par votre nom d'utilisateur sur le serveur.
Changez votre script bash de ceci:
mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz
pour ça:
mysqldump --login-path=local my_database | gzip > db_backup.tar.gz
Pas plus de mots de passe exposés.
Le moyen le plus simple est
mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
Vous pouvez également exécuter mysql_config_editor dans votre script pour transmettre le mot de passe lors de la spécification du chemin de connexion.
expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --Host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"
Cela démarre une session d'attente qui peut être utilisée dans les scripts pour interagir avec les invites
De https://Gist.github.com/nestoru/4f684f206c399894952d
# Let us consider the following typical mysql backup script:
mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database
# It succeeds but stderr will get:
# Warning: Using a password on the command line interface can be insecure.
# You can fix this with the below hack:
credentialsFile=/mysql-credentials.cnf
echo "[client]" > $credentialsFile
echo "user=$mysqlUser" >> $credentialsFile
echo "password=$mysqlPassword" >> $credentialsFile
echo "Host=$mysqlHost" >> $credentialsFile
mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database
# This should not be IMO an error. It is just a 'considered best practice'
# Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html
Shell> mysql_config_editor set --login-path=local
--Host=localhost --user=localuser --password
Enter password: enter password "localpass" here
Shell> mysql_config_editor set --login-path=remote
--Host=remote.example.com --user=remoteuser --password
Enter password: enter password "remotepass" here
Pour voir ce que mysql_config_editor a écrit dans le fichier .mylogin.cnf, utilisez la commande print:
Shell> mysql_config_editor print --all
[local]
user = localuser
password = *****
Host = localhost
[remote]
user = remoteuser
password = *****
Host = remote.example.com
La commande print affiche chaque chemin de connexion sous forme d'un ensemble de lignes commençant par un en-tête de groupe indiquant le nom du chemin de connexion entre crochets, suivi des valeurs d'option pour le chemin de connexion. Les valeurs de mot de passe sont masquées et n'apparaissent pas en texte clair.
Comme le montrent les exemples précédents, le fichier .mylogin.cnf peut contenir plusieurs chemins de connexion. De cette manière, mysql_config_editor facilite la configuration de plusieurs «personnalités» pour la connexion à différents serveurs MySQL. Chacun de ceux-ci peut être sélectionné par son nom ultérieurement à l'aide de l'option --login-path lorsque vous appelez un programme client. Par exemple, pour vous connecter au serveur local, utilisez cette commande:
Shell> mysql --login-path=local
Pour vous connecter au serveur distant, utilisez cette commande:
Shell> mysql --login-path=remote
Une autre alternative consiste à utiliser sshpass pour appeler mysql, par exemple:
sshpass -p topsecret mysql -u root -p username -e 'statement'
Voici une solution pour Docker dans un script/bin/sh:
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client]"> /root/mysql-credentials.cnf'
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "utilisateur = racine" >> /root/mysql-credentials.cnf'
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "mot de passe = $ MYSQL_ROOT_PASSWORD" >> /root/mysql-credentials.cnf'
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exécute mysqldump --defaults-extra-file =/root/mysql-credentials.cnf --all-database'
Remplacez [MYSQL_CONTAINER_NAME] et assurez-vous que la variable d'environnement MYSQL_ROOT_PASSWORD est définie dans votre conteneur.
J'espère que cela vous aidera comme cela pourrait m'aider!
Un simple script workaroud. Nommez ce "mysql" et mettez-le dans votre chemin avant "/ usr/bin". Des variantes évidentes pour d'autres commandes ou si le texte d'avertissement est différent.
#!/bin/sh
(
(
(
(
(
/usr/bin/mysql "$@"
) 1>&9
) 2>&1
) | fgrep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
) 1>&2
) 9>&1
ok, solution sans fichiers temporaires ou quoi que ce soit:
mysql --defaults-extra-file=<(echo $'[client]\npassword='"$password") -u $user -e "statement"
c'est semblable à ce que d'autres ont mentionné, mais ici vous n'avez pas besoin d'un fichier réel, cette partie de la commande simule le fichier: <(echo ...)
notez qu'il n'y a pas d'espace au milieu de <(
Personnellement, j'utilise un wrapper de script pour intercepter cette erreur. Voici un exemple de code:
#!/bin/bash
#echo $@ | cat >> /home/mysqldump.log 2>/dev/null
ERR_FILE=/tmp/tmp_mdump.err
# Execute dumper
/usr/bin/mysqldump $@ 2>$ERR_FILE
# Determine error and remove tmp file
ERROR=`cat $ERR_FILE`
rm $ERR_FILE
# Handle an error
if [ "" != "$ERROR" ]; then
# Error occured
if [ "Warning: Using a password on the command line interface can be insecure." != "$ERROR" ]; then
echo $ERROR >&2
exit 1
fi
fi
la meilleure solution consiste à utiliser un alias:
alias [yourapp]-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"
par exemple, mettez ceci dans votre script:
alias drupal-mysql="mysql -u root -psomepassword -P3306 -h 127.0.0.1"
puis plus tard dans votre script pour charger une base de données:
drupal-mysql database_name < database_dump.sql
pour exécuter une déclaration:
drupal-mysql -e "EXEC SOMESTATEMENT;"
Vous pouvez également simplement rediriger la sortie d'erreur standard STDERR vers/dev/null
Alors faites juste:
mysql -u $user -p$password -e "statement" 2> /dev/null
Pour PowerShell (pwsh
, pas bash
), il s’agissait là d’une solution plutôt rube-goldberg ... Ma première tentative a consisté à encapsuler les appels à mysql
dans une fonction try/catch
, mais en raison de comportement étrange dans le traitement des erreurs PowerShell , ce n'était pas viable.
La solution consistait à remplacer le $ErrorActionPreference
juste assez longtemps pour combiner et capturer STDERR
et STDOUT
, puis pour analyser le mot ERROR
et le relancer si nécessaire. La raison pour laquelle nous n'avons pas pu détecter et publier sur "^mysql.*Warning.*password"
est parce que PowerShell traite et soulève l'erreur en tant que flux, de sorte que vous devez tout capturer afin de filtrer et de relancer. : /
Function CallMySQL() {
# Cache the error action preference
$_temp = $ErrorActionPreference
$ErrorActionPreference = "Continue"
# Capture all output from mysql
$output = (&mysql --user=foo --password=bar 2>&1)
# Restore the error action preference
$ErrorActionPreference = $_temp
if ($output -match "ERROR") {
throw $output
} elseif($output) {
" Swallowing $output"
} else {
" No output"
}
}
Remarque: PowerShell est disponible pour Unix. Cette solution est donc multiplateforme. Il peut être adapté à bash
avec quelques modifications de syntaxe mineures.
Attention: Il y a des dizaines de cas Edge où cela ne fonctionnera pas, tels que des messages d'erreur non anglais ou des instructions qui renvoient le mot ERROR
n'importe où dans la sortie, mais cela suffisait pour avaler l'avertissement d'un message. appel de base à mysql
sans bombarder le script en entier. J'espère que d'autres trouveront cela utile.
Ce serait bien si mysql
ajoutait simplement une option pour supprimer cet avertissement.