mysqladmin non accetta la password in linea


10

Sto cercando di impostare un processo cron per l'esecuzione del backup dalla mia macchina slave. Quindi devo fermare lo schiavo

Ho dato un comando

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

Ma sta generando un errore:

mysqladmin: errore di connessione al server in "localhost" non riuscito: "Accesso negato per l'utente" root "@" localhost "(utilizzando la password: SÌ)"

Ora ho provato con il comando

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

Richiede la password e ho dato come test_passe tutto andava bene.

Perché è successo? Qual è l'alternativa?

NB: A proposito la mia versione mysql è mysql-5.0.95-5, ha senso.


La tua password ha caratteri speciali che la shell potrebbe interpretare? Hai provato a racchiudere la password tra "virgolette" o "virgolette"?
Michael - sqlbot,

quali sono i caratteri speciali che la shell potrebbe interpretare? c'è qualche documentazione?
Praveen Prasannan,

1
Personaggi come $ &! \ [] <> vengono tutti in mente come potenzialmente problematici. Racchiudere la password tra 'virgolette singole dovrebbe impedire questo problema. gnu.org/software/bash/manual/bashref.html#Quoting
Michael - sqlbot

2
ottimo .. funzionante. Vorrei contrassegnare questo come risposta. Puoi per favore metterlo come risposta
Praveen Prasannan,

@ Michael-sqlbot sì, dovresti postare come risposta
RolandoMySQLDBA

Risposte:


21

Gli argomenti della riga di comando sono soggetti a interpretazione da parte della shell dei comandi del sistema, modificando il comportamento del comando o cambiando il valore degli argomenti prima che vengano passati al programma chiamato.

Quando un argomento (come il valore per --password) contiene un carattere che la shell può interpretare, devono essere tra virgolette (di solito racchiuse tra virgolette singole 'in unix o virgolette doppie "in Windows) o salvate singolarmente (di solito con una barra rovesciata \prima di ogni metacarattere ) per evitare l'interpretazione da parte della shell.

Mentre i caratteri specifici sono specifici del sistema, alcuni personaggi a cui prestare attenzione includono:

$ & ! \ [ ] < > `

Se la password, per un esempio davvero negativo, fosse impostata su 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

Ulteriori letture:


Aggiornamento: per sfuggire alle virgolette 'singole o "doppie nella password, è possibile sfuggirle con una barra rovesciata iniziale o racchiudere l'intero argomento nello stile opposto delle virgolette se non ci sono altri caratteri che lo stile di quotazione scelto non è compatibile con.

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

Se hai una virgoletta singola e anche altri caratteri speciali, sei bloccato con la barra rovesciata perché, in unix, la doppia virgoletta è "più debole" di una virgoletta singola e molti metacaratteri vengono ancora espansi se racchiusi tra virgolette doppie ma non singole citazioni.

Questo non è specifico di MySQL ma si applica a qualsiasi cosa con argomenti da riga di comando.

In genere puoi usare il echocomando per vedere come la shell sta interpretando i tuoi argomenti.

$ 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

Follow-up: la shell bash (e presumibilmente alcune altre) consente di sfuggire a virgolette singole all'interno di stringhe a virgoletta singola, sebbene la convenzione sia bizzarra (probabilmente basata su una decisione dimenticata da tempo perduta ora nella notte dei tempi):

Sostituisci ciascuna 'all'interno della stringa con '\''prima di racchiudere l'intera stringa tra virgolette singole ... in modo che la stringa letterale foo'barsia espressa come 'foo'\''bar'.

Come ho detto, bizzarro. Ciò è necessario perché una barra rovesciata sfugge a una singola virgoletta all'esterno di una singola stringa tra virgolette, una barra rovesciata non sfugge a nulla all'interno di una stringa tra virgolette singole in bash e le stringhe tra virgolette singole possono essere chiuse e riaperte da più virgolette singole purché non vi siano caratteri di escape. personaggi che hanno un significato speciale. Quindi '\''chiude le virgolette della stringa, quindi fornisce il letterale con escape, quindi riapre le virgolette della stringa.


1
Hai bisogno di qualche chiarimento in più. Cosa succede se le virgolette singole (') arrivano nel campo della password? Scappare con slash () è l'unico modo?
Praveen Prasannan,

Che coincidenza con cui è impostata la password del mio server livepa$$word
Umair,

0

aggiunta:

Su una macchina Windows, abbiamo anche lottato con una password: conteneva ciò %che doveva essere evitato poiché %%(le citazioni da sole non sono abbastanza qui)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.