Comment passer le mot de passe à la ligne de commande mysql

20

J'ai un mot de passe MySQL enregistré sur un fichier foo.php, par exemple P455w0rd, lorsque j'essaie de l'utiliser:

$ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver
Enter password: (holds)

$ echo P455w0rd | mysql -u root -p mydb -h friendserver
Enter password: (holds)

Les deux options demandent toujours le mot de passe, quelle est la bonne façon d'envoyer le mot de passe stdin?

Kokizzu
la source
3
doit pas être vide entre -pet votre mot de passe.
Fırat KÜÇÜK
mysql ne lit pas le mot de passe de stdin, je n'ai pas pu comprendre de quoi il le lit.
Omn
La bonne réponse est de ne pas mettre vos mots de passe sur la ligne de commande où quiconque y ayant accès /procpeut les lire trivialement tant que le programme est en cours d'exécution . C'est à cela que ~/.my.cnfsert un , correctement réglé à 0600
Shadur

Réponses:

25

Vous devez être très prudent sur la façon dont vous passez des mots de passe aux lignes de commande car, si vous ne faites pas attention, vous finirez par le laisser ouvert au reniflement à l'aide d'outils tels que ps.


La façon la plus sûre de le faire serait de créer un nouveau fichier de configuration et de le transmettre à l' mysqlaide de l' option de ligne de commande --defaults-file=ou --defaults-extra-file=.

La différence entre les deux est que ce dernier est lu en plus des fichiers de configuration par défaut alors qu'avec le premier, seul le fichier transmis comme argument est utilisé.

Votre fichier de configuration supplémentaire doit contenir quelque chose de similaire à:

[client]
user=foo
password=P@55w0rd

Assurez-vous que vous sécurisez ce fichier.

Exécutez ensuite:

mysql --defaults-extra-file=<path to the new config file> [all my other options]
garethTheRed
la source
2
MySQL va modifier son argvpour écraser les paramètres donnés à l' -pindicateur. C'est du moins ce qui est conclu ici, ainsi que d'autres informations pertinentes: unix.stackexchange.com/questions/78757/…
Kusalananda
Il s'agit de la meilleure solution, car elle offre une certaine sécurité. Vous devez chmod go-rwx, et assurez-vous que cet argument précède tous les autres arguments.
ChuckCottrill
1
@Kusalananda, oui, mais selon les commentaires sur unix.stackexchange.com/q/385339/135943 , cela ne signifie pas que c'est sûr!
Wildcard
Cela pourrait valoir la peine d'ajouter une note --login-pathmaintenant qu'il est pris en charge. Ce n'est pas beaucoup mieux que cela, mais c'est un peu moins de texte brut (même si la barrière pour convertir le contenu en texte brut est faible).
Geoffrey Wiseman
6
Définissez MYSQL_PWD dans l'environnement ( export MYSQL_PWD=muhpassword) et exécutez votre commande sans le -p. Voir Variables d'environnement de programme MySQL . Malgré les avertissements désastreux du manuel , c'est plutôt sûr . À moins que vous ne commenciez un warez bizarre dans le même shell plus tard. Nous courons donc:MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
David Tonhofer
12

L' mysqlutilitaire client peut prendre un mot de passe sur la ligne de commande avec les options -pou --password=.

Si vous utilisez -p, il ne doit pas y avoir d'espace vide après la lettre d'option:

$ mysql -pmypassword

Je préfère les longues options dans les scripts car elles sont auto-documentées:

mysql --password=mypassword --user=me --host=etc
Kusalananda
la source
3
Ceci n'est pas sûr car tout utilisateur peut voir le mot de passe - soit directement via /proc/$pid/cmdlineou via la pscommande. Il est vrai que mysql écrase le mot de passe dans argv lors du démarrage mais il y a toujours une fenêtre de temps où un autre utilisateur peut observer le mot de passe. De plus, sur certains systèmes, l'écrasement d'argv peut ne pas fonctionner.
maxschlepzig
3

Si vous souhaitez commencer mysqlavec un mot de passe, vous devez d'abord récupérer le mot de passe dans une variable:

MYSQLPASS=`cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2`

Ensuite, vous pouvez démarrer votre mysqlcommande avec:

mysql -U root -p ${MYSQLPASS} mydb -h friendserver
Lambert
la source
1
Cela compromet également la sécurité de votre mot de passe . Notez qu'il y a la MYSQL_PWDvariable d'environnement qui est lue par mysqlsi vous ne spécifiez pas -p. Et sous Linux, c'est une méthode sécurisée car l'environnement d'un utilisateur ne peut pas être lu par d'autres utilisateurs sans privilèges - contrairement au vecteur d'argument.
maxschlepzig