mysqladmin não está usando a senha embutida

10

Estou tentando definir um trabalho cron para fazer backup da minha máquina escrava. Então eu preciso parar o escravo

Eu emiti um comando

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

Mas está lançando erro:

mysqladmin: falha ao conectar-se ao servidor no 'localhost' erro: 'Acesso negado para o usuário' root '@' localhost '(usando a senha: YES)'

Agora eu tentei com o comando

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

Ele solicita a senha e eu dei como test_passe estava tudo bem.

Por que isso aconteceu? Qual é a alternativa?

NB: Aliás, minha versão do mysql é mysql-5.0.95-5que faz algum sentido.

Praveen Prasannan
fonte
Sua senha possui caracteres especiais que o shell pode estar interpretando? Você tentou colocar a senha entre 'aspas' ou "aspas"?
Michael - sqlbot
Quais são os caracteres especiais que o shell pode obter para interpretar? existe alguma documentação?
Praveen Prasannan
11
Personagens como $ &! \ [] <> todos vêm à mente como potencialmente problemáticos. Colocar a senha entre 'aspas simples deve evitar esse problema. gnu.org/software/bash/manual/bashref.html#Quoting
Michael # sqlbot #
2
ótimo .. trabalhando. Eu gostaria de marcar isso como resposta. Você pode colocá-lo como resposta?
Praveen Prasannan
@ Sim Michael-sqlbot você deve colocar é como a resposta
RolandoMySQLDBA

Respostas:

21

Os argumentos da linha de comando estão sujeitos a interpretação pelo shell de comando do sistema, alterando o comportamento do comando ou alterando o valor dos argumentos antes de serem passados ​​para o programa chamado.

Quando um argumento (como o valor de --password) contém um caractere que o shell pode interpretar, ele precisa ser citado (geralmente entre aspas simples 'no unix ou aspas duplas "no Windows) ou ser escapado individualmente (geralmente com uma barra invertida \antes de cada metacaractere ) para evitar a interpretação do shell.

Embora os caracteres específicos sejam específicos do sistema, alguns caracteres a serem observados incluem:

$ & ! \ [ ] < > `

Se a senha, para um péssimo exemplo, estiver definida como 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

Leitura adicional:


Atualização: para escapar de aspas 'simples ou "duplas na senha, você pode escapá-las com uma barra invertida à esquerda ou colocar todo o argumento no estilo oposto de aspas, se não houver outros caracteres que o estilo de citação escolhido não seja compatível com.

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 você possui uma citação simples e outros caracteres especiais, está com a barra invertida escapando porque, no unix, a citação dupla é "mais fraca" do que uma citação única e muitos metacaracteres ainda são expandidos quando colocados entre aspas duplas, mas não individuais. citações.

Isso não é específico do MySQL, mas se aplica a qualquer coisa com argumentos de linha de comando.

Normalmente, você pode usar o echocomando para ver como o shell está interpretando seus argumentos.

$ 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

Acompanhamento: O shell bash (e presumivelmente alguns outros) permite escapar aspas simples dentro de strings de aspas simples, embora a convenção seja bizarra (provavelmente baseada em alguma decisão esquecida perdida agora para as brumas do tempo):

Substitua cada um 'dentro da cadeia por '\''antes de agrupar a cadeia inteira entre aspas simples ... para que a cadeia literal foo'barseja expressa como 'foo'\''bar'.

Como eu disse, bizarro. Isso é necessário porque uma barra invertida escapa uma citação única fora de uma única cadeia de caracteres entre aspas, uma barra invertida não escapa nada dentro de uma cadeia de caracteres entre aspas simples no bash e as cadeias de caracteres entre aspas simples podem ser fechadas e reabertas por várias aspas simples, desde que não haja escape caracteres intervenientes com significado especial. Então '\''fecha a citação da sequência, fornece o literal escapado e reabre a citação da sequência.

Michael - sqlbot
fonte
11
Precisa de um pouco mais de esclarecimento. E se aspas simples (') aparecerem no campo de senha? Escapá-lo com slash () é a única maneira?
Praveen Prasannan
O que um co-incidente que a senha do meu servidor ao vivo está definido parapa$$word
Umair
0

Adição:

Em uma máquina Windows, também lutamos com uma senha: ela contém as %que precisam ser escapadas como %%(As aspas por si só não são suficientes aqui)

diagnosticar
fonte