Supprimer les messages d'avertissement en utilisant mysql à partir de L'intérieur du Terminal, mais mot de passe écrit en script bash

quand j'ai essayé D'exécuter la commande suivante sur MySQL depuis le Terminal:

mysql -u $user -p$password -e "statement"

l'exécution fonctionne comme prévu, mais il émet toujours un avertissement:

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, parce que je veux exécuter la commande de façon itérative dans le script bash à partir du Terminal, et je n'aime certainement pas l'idée d'attendre qu'une invite apparaisse et de me forcer à entrer mon mot de passe 50 ou 100 fois dans un seul script. Donc voici ma question:

  • Est-il possible de supprimer l'avertissement? La commande fonctionne correctement comme je l'ai dit, mais la fenêtre devient assez désordonnée quand 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 c'est le cas, dois-je entrer mon mot de passe chaque fois que l'invite me force à le faire?

Running man mysql n'aide pas, disant seulement que

--show-warnings

Faire afficher les Avertissements après chaque énoncé s'il y en a. Cette option s'applique à mode interactif et par lots.

et ne mentionne rien sur la façon d'éteindre la fonctionnalité, si Je ne manque pas quelque chose.

je suis sur OS X Mavericks 10.9.1 et de l'utilisation de MySQL 5.6 à partir de homebrew.

196
demandé sur Simon East 2013-12-24 01:21:14

19 réponses

si votre version client/serveur MySQL est une 5.6.x une façon d'éviter le message D'avertissement sont en utilisant le mysql_config_editor outils:

mysql_config_editor set --login-path=local --host=localhost --user=username --password

alors vous pouvez utiliser dans votre script shell:

mysql --login-path=local  -e "statement"

au lieu de:

mysql -u username -p pass -e "statement"
188
répondu Cristian Porta 2016-01-25 23:41:21

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 permet d'avoir plusieurs fichiers de configuration pour les différents serveurs/rôles/bases de données. Using ~/.mon Dieu.cnf ne vous permettra d'avoir qu'un seul jeu de configuration (bien qu'il puisse s'agir d'un ensemble utile de valeurs par défaut).

si vous êtes sur une distribution basée sur Debian, et que vous exécutez en tant que root, vous pouvez sauter la ci-dessus et utilisez simplement /etc/mysql/debian.cnf ... :

mysql --defaults-extra-file=/etc/mysql/debian.cnf

154
répondu David Goodwin 2014-09-23 19:35:01

L'une des méthodes qui est commode (mais tout aussi peu sûre) est d'utiliser:

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"

notez que les docs officiels recommandent contre elle.

Voir 6.1.2.1 directives de L'utilisateur final concernant la sécurité des mots de passe (manuel Mysql pour la Version 5.6) :

enregistrement de votre mot de passe dans le MYSQL_PWD variable d'environnement

cette méthode pour spécifier votre mot de passe MySQL doit être considérée comme extrêmement peu sûre et ne doit pas être utilisée. Certaines versions de ps incluent une option pour afficher l'environnement des processus en cours d'exécution. Sur certains systèmes, si vous définissez MYSQL_PWD , votre mot de passe est exposé à tout autre utilisateur qui exécute ps . Même sur les systèmes sans une telle version de ps , il est imprudent de supposer que là pas d'autres méthodes par lesquelles les utilisateurs peuvent examiner le processus.

143
répondu Ivan Dokov 2017-06-21 14:29:08

Si vous souhaitez utiliser un mot de passe dans la ligne de commande, j'ai trouvé que cela fonctionne pour filtrer le message d'erreur spécifique:

mysqlcommand 2>&1 | grep -v "Warning: Using a password"

il s'agit essentiellement de rediriger l'erreur standard vers la sortie standard -- et d'utiliser grep pour supprimer toutes les lignes qui correspondent à"Avertissement: utiliser un mot de passe".

de cette façon, vous pouvez voir toute autre sortie, y compris les erreurs. Je l'utilise pour divers scripts shell, etc.

45
répondu johnmontfx 2016-01-15 19:01:58

Voici comment j'ai obtenu mon script bash pour mes sauvegardes quotidiennes de la base de données mysqldump pour travailler plus en sécurité. C'est une extension de la grande réponse de Cristian Porta.

  1. première utilisation mysql_config_editor (fourni avec mysql 5.6+) pour configurer le fichier de mots de passe crypté. Supposons que votre nom d'utilisateur est "db_user". À partir de l'invite shell:

    mysql_config_editor set --login-path=local --host=localhost --user=db_user --password
    

    il invite pour le mot de passe. Une fois que vous entrez, le l'utilisateur / le laissez-passer sont enregistrés cryptés dans votre home/system_username/.mylogin.cnf

    bien sûr, changez" system_username " en 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
    

    à ceci:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz
    

plus de mots de passe exposés.

30
répondu Buttle Butkus 2017-03-30 21:41:27

la voie la plus facile est

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
10
répondu JavaGuy 2014-03-23 17:25:03

vous pouvez également lancer le mysql_config_editor dans votre script pour passer dans le mot de passe en spécifiant le 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}
"

ceci démarre une session d'attente qui peut être utilisée dans les scripts pour interagir avec les invites

voir ce billet

8
répondu phylanx 2017-05-23 11:47:28

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
répondu Nestor Urquiza 2015-10-08 13:28:59

une autre solution consiste à utiliser sshpass pour invoquer mysql, par exemple:

sshpass -p topsecret mysql -u root -p username -e 'statement'
1
répondu lewiz 2014-03-13 14:44:46
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 au .mylogin.fichier cnf, utilisez la commande d'impression:

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 comme 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 mots de passe sont masqués et n'apparaissent pas sous forme de texte clair.

comme le montrent les exemples précédents, le .mylogin.fichier cnf can contient plusieurs chemins de connexion. De cette façon, mysql_config_editor rend facile de configurer plusieurs "personnalités" pour se connecter à différents serveurs MySQL. N'importe lequel de ceux-ci peut être sélectionné par nom plus tard en utilisant l'option --login-path lorsque vous invoquez un programme client. Par exemple, pour se 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
1
répondu Beta 2015-01-15 14:14:46

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 "user=root" >> /root/mysql-credentials.cnf

docker exec [MYSQL_CONTAINER_NAME] sh-c 'exec echo" password=$MYSQL_ROOT_PASSWORD " > > /root/mysql-credentials.cnf

docker exec [MYSQL_CONTAINER_NAME] sh-c 'exec mysqldump --defaults-extra-file=/root/mysql-credentials.cnf -- toutes les bases de données

remplacez [MYSQL_CONTAINER_NAME] et assurez-vous que la variable D'environnement MYSQL_ROOT_PASSWORD est définie dans votre conteneur.

espérons qu'il vous aidera comme il pourrait m'aider !

1
répondu pcmanprogrammeur 2018-06-12 18:44:27

personnellement, j'utilise script wrapper pour attraper 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
répondu And 2015-01-29 14:29:16

pour PowerShell ( pwsh , pas bash ), c'était une solution rube-goldberg... Ma première tentative a été d'envelopper les appels à mysql dans une fonction try/catch , mais en raison de quelque comportement étrange dans la manipulation D'erreur de PowerShell , ce n'était pas viable.

la solution était de remplacer le $ErrorActionPreference juste assez longtemps pour combiner et capturer STDERR et STDOUT et parse pour le mot ERROR et re-jeter en tant que de besoin. La raison pour laquelle nous ne pouvions pas attraper et relâcher sur "^mysql.*Warning.*password" est parce que PowerShell gère et augmente l'erreur comme un flux, donc vous doit capturer tout 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"
    }
}

Note: PowerShell est disponible pour Unix, cette solution est donc multi-plateforme. Il peut être adapté à bash , avec quelques modifications mineures de syntaxe.

Avertissement: Il y a des dizaines de bord-les cas où cela ne fonctionne pas comme les non-anglais des messages d'erreur ou des énoncés qui renvoient le mot ERROR n'importe où dans la sortie, mais c'était suffisant pour avaler l'avertissement de base pour un appel à mysql sans les bombardements de l'ensemble de script. J'espère que d'autres trouver cela utile.

Ce serait bien si mysql simplement ajouté une option pour supprimer cette alerte.

0
répondu tresf 2018-07-27 15:22:29

vous pouvez aussi simplement rediriger la sortie standard error vers /dev / null

il suffit Donc de faire:

mysql -u $user -p$password -e "statement" 2> /dev/null

0
répondu Joseph Shih 2018-09-05 07:34:01

une autre solution (à partir d'un script, par exemple):

 sed -i'' -e "s/password=.*$/password=$pass/g" ~/.my.cnf
 mysql -h $host -u $user $db_name -e "$sql_cmd"

l'option -i'' est ici pour la compatibilité avec Mac OS X. Les Unix OS standards peuvent utiliser directement -i

-2
répondu Benoit Duffez 2014-10-16 12:07:02

le problème que j'avais était d'utiliser la sortie dans un conditionnel dans un script bash.

Ce n'est pas élégant, mais dans un docker env cela devrait vraiment pas d'importance. Fondamentalement, tout cela n'est ignorer la sortie qui n'est pas sur la dernière ligne. Vous pouvez faire la même chose avec awk, et changer pour retourner tout sauf la première ligne etc.

cela ne retourne que la dernière ligne

mysql -u db_user -pInsecurePassword my_database ... | sed -e '$!d'

il ne supprimera pas l'erreur, mais il fera en sorte que vous pouvez utiliser la sortie d'une requête dans un script bash.

-2
répondu WiR3D 2016-02-29 19:46:27

un simple script workaroud. Nommez ce "mysql", et mettez-le sur votre chemin avant"/usr/bin". 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
-2
répondu David G. 2017-04-14 04:09:26

vous pouvez exécuter mySQL et supprimer les messages d'avertissement et d'erreur en utilisant /dev / null par exemple:

# if you run just a SQL-command
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} -e "${STATEMENT}" &> /dev/null

# Or you can run SQL-script as a file
mysql -u ${USERNAME} -p${PASSWORD} -h ${HOST} ${DATABASE} < ${FILEPATH} &> /dev/null

où:

${USERNAME} - existing mysql user

${PASSWORD} - password

${HOST}     - ip or hostname, for example 'localhost'

${DATABASE} - name of database

${STATEMENT}- SQL command

${FILEPATH} - Path to the SQL-script

profitez-en!

-3
répondu Stan Khalipa 2014-11-12 08:06:25

ça a marché pour moi- Vient d'ajouter 2> null après le $(mysql_command) , et il supprimera les erreurs et les messages D'avertissement seulement.

-3
répondu MMG 2017-10-10 12:46:25