mysqladmin ne prend pas de mot de passe en ligne

10

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' erreur: '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é au fur test_passet à mesure que tout allait bien.

Pourquoi est-il arrivé ainsi? Quelle est l'alternative?

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

Praveen Prasannan
la source
Votre mot de passe a-t-il des caractères spéciaux que le shell pourrait interpréter? Avez-vous essayé de placer le mot de passe entre "guillemets" ou "guillemets"?
Michael - sqlbot
Quels sont les caractères spéciaux que l'interpréteur de commandes peut obtenir en interprétation? existe-t-il une documentation?
Praveen Prasannan
1
Des personnages comme $ &! \ [] <> tous me viennent à l'esprit comme potentiellement problématiques. Mettre le mot de passe entre 'guillemets simples devrait éviter ce problème. gnu.org/software/bash/manual/bashref.html#Quoting
Michael - sqlbot
2
super .. travail. Je voudrais marquer cela comme réponse. Pouvez-vous le mettre comme réponse
Praveen Prasannan
@ Michael-sqlbot oui, vous devriez poster est la réponse
RolandoMySQLDBA

Réponses:

21

Les arguments de la ligne de commande sont sujets à interprétation par l'interpréteur de commandes 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, il doit être soit cité (généralement entre guillemets simples 'dans unix ou double entre guillemets "dans Windows) ou échappé individuellement (généralement avec une barre oblique inverse \avant chaque métacaractère). ) pour éviter une 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 aux guillemets 'simples ou "doubles dans le mot de passe, vous pouvez soit les échapper avec une barre oblique inversée, soit enfermer l'argument entier dans le style de guillemets opposé s'il n'y a pas d'autres caractères que le style de citation choisi n'est pas compatible avec.

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 echocommande 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 vraisemblablement certains autres) permet d'échapper aux guillemets simples dans les 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 chacun 'à l'intérieur de la chaîne par '\''avant de mettre la chaîne entière entre guillemets simples ... afin que la chaîne littérale foo'barsoit exprimée sous la forme 'foo'\''bar'.

Comme je l'ai dit, bizarre. Cela est nécessaire car une barre oblique inversée échappe à un guillemet simple en dehors d'une seule chaîne entre guillemets, une barre oblique inversée n'échappe rien à l' intérieur d'une chaîne entre guillemets simples dans bash, et les chaînes entre guillemets simples peuvent être fermées et rouvertes par plusieurs guillemets simples tant qu'il n'y a pas d'échappée personnages intermédiaires qui ont une signification particulière. Alors '\''ferme la citation de la chaîne, puis fournit alors littéral, se sont échappés rouvre la citation de la chaîne.

Michael - sqlbot
la source
1
Besoin d'un peu plus de clarification. Que faire si des guillemets simples (') apparaissent dans le champ du mot de passe? Échapper avec slash () est le seul moyen?
Praveen Prasannan
Quel co-incident que le mot de passe de mon serveur en direct est définipa$$word
Umair
0

Une addition:

Sur une machine Windows, nous avons également eu du mal avec un mot de passe: il contenait %ce qu'il fallait échapper car %%(Les citations seules ne suffisent pas ici)

dognose
la source