web-dev-qa-db-fra.com

Supprimer les messages d'avertissement utilisant mysql depuis Terminal, mais le mot de passe écrit dans le script bash

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.

213
Blaszard

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"
204
Cristian Porta

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

170
David Goodwin

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.

151
Ivan Dokov

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.

53
johnmontfx

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.

  1. 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.

  2. 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.

37
Buttle Butkus

Le moyen le plus simple est 

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
11
JavaGuy

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

Voir ce post

9
phylanx

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
4
Nestor Urquiza
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
3
Beta

Une autre alternative consiste à utiliser sshpass pour appeler mysql, par exemple:

sshpass -p topsecret mysql -u root -p username -e 'statement'
2
lewiz

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!

2
pcmanprogrammeur

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
1
David G.

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 <(

1
santiago arizti

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
0
And

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;"
0
user356540

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

0
Joseph Shih

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.

0
tresf