Estou tentando definir uma tarefa cron para fazer backup da minha máquina escrava. Então eu preciso parar o escravo
Eu dei um comando
mysqladmin --user=root --password=test_pass stop-slave
Mas está dando erro:
mysqladmin: erro de conexão com o servidor em 'localhost': 'Acesso negado para usuário 'root'@'localhost' (usando senha: SIM)'
Agora eu tentei com o comando
mysqladmin --user=root --password stop-slave
Ele solicita a senha e eu dei como test_pass
e estava tudo bem.
Por que isso aconteceu? Qual é a alternativa?
NB: BTW minha versão mysql é mysql-5.0.95-5
, faz algum sentido.
Os argumentos da linha de comando estão sujeitos à 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 para
--password
) contém um caractere que o shell pode interpretar, eles precisam ser citados (geralmente entre aspas simples'
no unix ou aspas duplas"
no Windows) ou escapados individualmente (geralmente com uma barra invertida\
antes de cada metacaractere ) para evitar a interpretação pelo shell.Embora os caracteres específicos sejam específicos do sistema, alguns caracteres a serem observados incluem:
Se a senha, para um exemplo muito ruim, fosse definida como
pa$$word
...Leitura adicional:
Atualização: para escapar de aspas
'
simples ou"
duplas na senha, você pode escapá-las com uma barra invertida inicial 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.Se você tiver uma aspa simples e outros caracteres especiais também, ficará preso com a barra invertida escapando porque, no unix, a aspa dupla é "mais fraca" do que uma aspa simples e muitos metacaracteres ainda são expandidos quando colocados entre aspas duplas, mas não simples 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
echo
comando para ver como o shell está interpretando seus argumentos.Acompanhamento: O shell bash (e presumivelmente alguns outros) permite escapar de aspas simples dentro de strings de aspas simples, embora a convenção seja bizarra (provavelmente baseada em alguma decisão há muito esquecida perdida agora na névoa do tempo):
Substitua cada um
'
dentro da string por'\''
antes de colocar toda a string entre aspas simples... para que a string literalfoo'bar
seja expressa como'foo'\''bar'
.Como eu disse, bizarro. Isso é necessário porque uma barra invertida escapa de uma aspa simples fora de uma string com aspas simples, uma barra invertida não escapa de nada dentro de uma string com aspas simples no bash e strings com aspas simples podem ser fechadas e reabertas por várias aspas simples, desde que não haja caracteres intermediários que têm um significado especial. Então
'\''
fecha as aspas da string, fornece o literal de escape e reabre as aspas da string.Adição:
Em uma máquina Windows, também lutamos com uma senha: ela continha
%
qual necessidade de escape%%
(as aspas sozinhas não são suficientes aqui)