web-dev-qa-db-fra.com

mysqladmin ne prend pas le mot de passe en ligne

J'essaie de définir un travail cron pour prendre la sauvegarde de ma machine esclave. J'ai donc besoin d'arrêter l'esclave

J'ai émis une commande

mysqladmin --user=root --password=test_pass stop-slave

Mais c'est jeter une erreur:

mysqladmin: échec de la connexion au serveur à 'localhost': 'Accès refusé pour l'utilisateur' root '@' localhost '(en utilisant le mot de passe: OUI)'

Maintenant, j'ai essayé avec la commande

mysqladmin --user=root --password stop-slave

Il demande un mot de passe et j'ai donné comme test_pass et tout allait bien.

Pourquoi est-ce arrivé? Quelle est l'alternative?

NB: BTW ma version mysql est mysql-5.0.95-5, ça a du sens.

10
Praveen Prasannan

Les arguments de la ligne de commande sont sujets à interprétation par le shell de commande du système, modifiant le comportement de la commande ou modifiant la valeur des arguments avant qu'ils ne soient transmis au programme appelé.

Lorsqu'un argument (tel que la valeur de --password) contient un caractère que le shell peut interpréter, ils doivent être entre guillemets (généralement entre guillemets simples ' en unix ou en guillemet double " sous Windows) ou échappé individuellement (généralement avec une barre oblique inversée \ avant chaque métacaractère) pour éviter toute interprétation par le Shell.

Bien que les caractères spécifiques soient spécifiques au système, certains caractères à surveiller incluent:

$ & ! \ [ ] < > `

Si le mot de passe, pour un très mauvais exemple, était défini sur pa$$Word ...

mysql --password=pa$$Word     # does not work
mysql --password='pa$$Word'   # works
mysql --password=pa\$\$Word   # works, but slightly unclear what's going on at first glance

Lectures complémentaires:


Mise à jour: pour échapper à ' simple ou " guillemets doubles dans le mot de passe, vous pouvez soit les échapper avec une barre oblique inversée, soit placer l'intégralité de l'argument dans le style de guillemets opposé s'il n'y a pas d'autres caractères avec lesquels le style de guillemets choisi n'est pas compatible.

mysql --password="like'this" # password has a single quote in the middle
mysql --password='like"this' # password with a double quote in the middle

Si vous avez un guillemet simple et d'autres caractères spéciaux, vous êtes coincé avec une barre oblique inversée car, sous Unix, le guillemet double est "plus faible" qu'un guillemet simple et de nombreux métacaractères sont toujours développés lorsqu'ils sont placés entre guillemets doubles mais pas simples citations.

Ce n'est pas spécifique à MySQL mais s'applique à tout ce qui a des arguments en ligne de commande.

Vous pouvez généralement utiliser la commande echo pour voir comment le shell interprète vos arguments.

$ echo foo$bar 
foo                # literal 'foo' plus the (empty) Shell variable $bar

$ echo foo\$bar
foo$bar            # backslash prevents expansion of $bar as a variable

$ echo "foo$$bar"  # weaker double quote doesn't prevent expansion so
foo9691bar         # the $$ expands to the unix process id (pid) of the current Shell

$ echo 'foo$$bar'
foo$$bar           # "stronger" single quote prevents Shell expansion

$ echo "foo'bar"
foo'bar            # double quote allows single quote within the literal

Suivi: le shell bash (et probablement certains autres) permet d'échapper aux guillemets simples dans des chaînes entre guillemets simples, bien que la convention soit bizarre (probablement basée sur une décision oubliée depuis longtemps perdue dans la nuit des temps):

Remplacez chaque ' à l'intérieur de la chaîne avec '\'' avant de mettre la chaîne entière entre guillemets simples ... donc la chaîne littérale foo'bar est exprimé par 'foo'\''bar'.

Comme je l'ai dit, bizarre. Ceci est nécessaire car une barre oblique inverse échappe à un guillemet simple en dehors d'une chaîne entre guillemets unique, une barre oblique inversée échappe rien à l'intérieur d'une chaîne entre guillemets simples dans bash, et single les chaînes entre guillemets peuvent être fermées et rouvertes par plusieurs guillemets simples tant qu'il n'y a pas de caractères intermédiaires non échappés ayant une signification spéciale. Donc '\'' ferme la citation de la chaîne, puis fournit le littéral échappé, puis rouvre la citation de la chaîne.

21
Michael - sqlbot

Une addition:

Sur une machine Windows, nous avons également eu du mal avec un mot de passe: il contenait % qui doit être échappé par %% (Les citations seules ne suffisent pas ici)

0
dognose