Lorsque j'ai essayé d'exécuter la commande suivante sur MySQL depuis Terminal:
mysql -u $user -p$password -e "statement"
L'exécution fonctionne comme prévu, mais elle é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, car je veux exécuter la commande de manière itérative dans le script bash à partir de Terminal, et je n'aime vraiment pas l'idée d'attendre une invite qui s'affiche et me forçant à saisir mon mot de passe 50 ou 100 fois dans un seul script. Voici donc 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 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 c'est le cas, dois-je taper mon mot de passe chaque fois que l'invite me force à le faire?
Courir man mysql
n'aide pas, en disant seulement
--show-warnings
Faire apparaître des avertissements après chaque instruction, le cas échéant. Cette option s'applique au mode interactif et par lots.
et ne mentionne rien sur la façon de désactiver la fonctionnalité, si je ne manque pas quelque chose.
Je suis sur OS X 10.9.1 Mavericks et utilise MySQL 5.6 de homebrew.
[client]
password=my_password
dans smth~/.my.cnf
). Certes, cela a également des implications en matière de sécurité, mais au moins il n'est pas accessible à quiconque peut s'exécuterps
, et vous en avez le contrôle avec les autorisations de fichier.mysql -u root password root -e "statement" > /dev/null
?pexcept
. Il peut effectuer des insertions de terminal et également gérer les commentaires fournis par la commande. De cette façon, vous pouvez simplement ignorer la sortie détaillée et la bande de la sortie réelle que vous voulez :)Réponses:
Si votre version client / serveur MySQL est un moyen 5.6.xa d'éviter le message AVERTISSEMENT, utilisez les outils mysql_config_editor :
Ensuite, vous pouvez utiliser dans votre script shell:
Au lieu de:
la source
--login-path
doit précéder tous les autres arguments. J'essayaismysqldump --tables --login-path=local
et obtenais l'erreurunknown variable 'login-path=local'
.J'utilise quelque chose comme:
ou
Où config.cnf contient:
Cela vous permet d'avoir plusieurs fichiers de configuration - pour différents serveurs / rôles / bases de données. L'utilisation de ~ / .my.cnf ne vous permettra d'avoir qu'un seul ensemble de configuration (bien qu'il puisse s'agir d'un ensemble utile de valeurs par défaut).
Si vous utilisez une distribution basée sur Debian et que vous exécutez en tant que root, vous pouvez ignorer ce qui précède et utiliser simplement /etc/mysql/debian.cnf pour entrer ...:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
la source
--defaults-extra-file
doit être la première option sinon mysql se plaintmysqldump: unknown variable 'defaults-extra-file
.MYSQL_PWD
mysql --defaults-extra-file=<(printf "[client]\nuser = %s\npassword = %s" "$user" "$pwd") -e "statement"
. Puisque leprintf
est exécuté directement par Bash, il n'apparaît pas dansps
.--defaults-file
plutôt que--defaults-extra-file
, car ce dernier donnait la préférence aux paramètres de ~ / .my.cnf.Une méthode pratique (mais tout aussi peu sûre) consiste à utiliser:
Notez que les documents officiels le déconseillent.
Voir 6.1.2.1 Instructions pour l'utilisateur final pour la sécurité des mots de passe (Manuel Mysql pour la version 5.6) :
la source
Access denied for user 'root'@'localhost' (using password: NO)
export MYSQL_PWD=whatever
.export
, placez le tout sur une seule ligne:MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
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:
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: utilisation d'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.
la source
Voici comment j'ai obtenu mon script bash pour que mes sauvegardes quotidiennes de bases de données mysqldump fonctionnent de manière plus sécurisée. Il s'agit d'une extension de la grande réponse de Cristian Porta.
Utilisez d'abord mysql_config_editor (fourni avec mysql 5.6+) pour configurer le fichier de mot de passe crypté. Supposons que votre nom d'utilisateur soit "db_user". Exécution à partir de l'invite du shell:
Il vous demande le mot de passe. Une fois que vous l'avez entré, l'utilisateur / pass est enregistré crypté dans votre
home/system_username/.mylogin.cnf
Bien sûr, changez "system_username" en votre nom d'utilisateur sur le serveur.
Modifiez votre script bash à partir de ceci:
pour ça:
Plus de mots de passe exposés.
la source
Le moyen le plus simple est
la source
2>/dev/null | grep -v "mysql: [Warning] Using a password on the command line interface can be insecure."
pour supprimer uniquement l'avertissement en questionVous 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
Cela démarre une session attendue qui peut être utilisée dans les scripts pour interagir avec les invites
Voir cet article
la source
ok, solution sans fichiers temporaires ou quoi que ce soit:
c'est similaire à 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 ...)
(remarquez qu'il n'y a pas d'espace au milieu de<(
la source
.my.cnf
fichier~/.
avec une entrée de mot de passePour voir ce que mysql_config_editor a écrit dans le fichier .mylogin.cnf, utilisez la commande print:
La commande d'impression affiche chaque chemin de connexion sous la 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 façon, mysql_config_editor facilite la configuration de plusieurs «personnalités» pour la connexion à différents serveurs MySQL. Chacun de ces éléments 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:
Pour vous connecter au serveur distant, utilisez cette commande:
la source
Depuis https://gist.github.com/nestoru/4f684f206c399894952d
la source
Une autre alternative consiste à utiliser sshpass pour appeler mysql, par exemple:
la source
Un script de workaroud simple. Nommez ce "mysql", et placez-le dans votre chemin avant "/ usr / bin". Variantes évidentes pour d'autres commandes, ou si le texte d'avertissement est différent.
la source
Voici une solution pour Docker dans un script / bin / sh:
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!
la source
docker exec [MYSQL_CONTAINER_NAME] sh -c 'exec echo "[client] [RETURN HERE] password=pa55" > /root/defaults'
utilisant le--defaults-file
il prend déjà racine aussi.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
la source
Personnellement, j'utilise un wrapper de script pour détecter cette erreur. Voici un exemple de code:
la source
Pour PowerShell (
pwsh
, pasbash
), c'était une solution assez rube-goldberg ... Ma première tentative a été d'envelopper les appelsmysql
dans unetry/catch
fonction, mais en raison d'un comportement étrange dans la gestion des erreurs PowerShell , ce n'était pas viable.La solution était de remplacer le
$ErrorActionPreference
juste assez longtemps pour combiner et la captureSTDERR
etSTDOUT
Requérir et analyser le motERROR
et re-lancer au besoin. La raison pour laquelle nous n'avons pas pu intercepter et publier"^mysql.*Warning.*password"
est que PowerShell gère et déclenche l'erreur comme un seul flux, vous devez donc tout capturer pour filtrer et relancer. : /Remarque: PowerShell est disponible pour Unix, cette solution est donc multi-plateforme. Il peut être adapté
bash
avec quelques modifications mineures de syntaxe.Avertissement: Il existe des dizaines de cas marginaux où cela ne fonctionne pas, tels que des messages d'erreur ou des instructions non anglais qui renvoient le mot
ERROR
n'importe où dans la sortie, mais cela a suffi à avaler l'avertissement pour un appel de basemysql
sans bombarder le script entier. J'espère que d'autres trouveront cela utile.Ce serait bien de
mysql
simplement ajouter une option pour supprimer cet avertissement.la source
S'il vous arrive d'utiliser Rundeck pour planifier vos tâches, ou toute autre plate-forme où vous demandez un
mylogin.cnf
fichier, j'ai utilisé avec succès le code shell suivant pour fournir un nouvel emplacement pour le fichier avant de procéder aux appels SQL:Où
MYSQL_TEST_LOGIN_FILE
est une variable d'environnement qui peut être définie sur un chemin de fichier différent de celui par défaut.Ceci est particulièrement utile si vous exécutez dans un processus fourchu et ne pouvez pas déplacer ou copier des fichiers dans le
$HOME
répertoire.Voir la documentation ici.
la source
la meilleure solution est d'utiliser l'alias:
par exemple, mettez ceci dans votre script:
puis plus tard dans votre script pour charger une base de données:
pour exécuter une instruction:
la source
Définissez l'assistant:
Utilise le:
Tachaan! Votre code est propre et agréable à lire
(testé avec bash)
la source
Une autre solution (à partir d'un script, par exemple):
L'
-i''
option est ici pour la compatibilité avec Mac OS X. Les systèmes d'exploitation UNIX standard peuvent utiliser directement-i
la source
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 ne devrait vraiment pas avoir d'importance. Fondamentalement, cela ne fait qu'ignorer la sortie qui n'est pas sur la dernière ligne. Vous pouvez faire de même avec awk, et changer pour renvoyer tout sauf la première ligne, etc.
Cela ne renvoie que la dernière ligne
Il ne supprimera pas l'erreur, mais il s'assurera que vous pouvez utiliser la sortie d'une requête dans un script bash.
la source
La façon la plus simple:
Saisissez-le et vous devrez saisir votre mot de passe.
Remarque: Oui, sans point-virgule.
la source
Vous pouvez exécuter mySQL et supprimer les messages d'avertissement et d'erreur en utilisant / dev / null par exemple:
Où:
prendre plaisir!
la source
Cela a fonctionné pour moi - vient d'être ajouté
2> null
après le$(mysql_command)
, et il supprimera uniquement les messages d'erreurs et d'avertissement.la source
2>/dev/null
. Utiliser2> null
ne ferait que mettre la sortie dans un fichier appelé "null" dans le répertoire courant.