como desativar o caractere $ escapando na linha de comando

3

Eu li inúmeros tópicos sobre isso, mas nenhum aborda esse problema.

Eu preciso ter uma expressão MySQL executada na linha de comando essa expressão contém $ que são escapadas e assim arruína o comportamento do MySQL

mysql -u root -p -e "some statement that change a pa$$word"

alguém me disse para verificar com printf

printf "%q\n" 'pa$$word'
pa\$\$word

então eu preciso não escapar do $ senão a senha errada é inserida na consulta do MySQL.

    
por guest1324 11.08.2016 / 09:07

3 respostas

9

Você entendeu mal alguns mecanismos.

Quando você coloca uma frase entre aspas simples, ou seja, ' , não há expansão e você não precisa escapar do $ s. Expansão significa que existem caracteres especiais como $ , que, se não forem removidos, acionam procedimentos especiais de shell. Então, quando você suprime a expansão com aspas simples, não precisa escapar delas. Assim use:

mysql -u root -p -e 'some statement that change a pa$$word'

Quanto a printf , o que você fez não está sendo verificado. Chamar com %q adiciona as barras invertidas ao $ s.

Se algo não funcionou, foi porque $$ foi alterado para o PID (ID do processo) do shell. Isso é o que o shell faz dessa combinação de caracteres especiais em seu contexto normal, ie. quando eles não são escapados ou colocados entre aspas simples.

    
por 11.08.2016 / 09:17
2

Isso me ajudou,

$ mysql -uroot -p'secret' -e "UPDATE users SET
password='pa\$\$word',email='[email protected]' WHERE id = 1;"
    
por 11.08.2016 / 09:23
2

Se você não deseja a expansão $variable , vejo três opções:

  1. Use aspas simples em vez de aspas duplas (mas você precisará fugir das aspas simples em sua declaração! Então, você ainda precisa adequadamente lidar com o escape!
  2. Use um shell diferente, um que não suporte $variables (não tenho conhecimento de nenhum shell bom que não seja)
  3. Na verdade, use variáveis em seu benefício (mas cuidado, você ainda precisa lidar com o escape SQL para evitar ataques de injeção de SQL):

Ou seja. você pode fazer isso (cuidado, a noção exata para definir a variável varia de acordo com o seu shell! Abaixo não foi testado, apenas para dar a idéia):

 pass='pa$$word'
 mysql -whatever "dangerous sql injection statement '$pass' if you cannot trust the pass variable"

Mas use instruções preparadas e uma linguagem de programação projetada para isso, em vez de um script de shell. É muito menos provável que quebre.

Lembre-se de Little Bobby Tables . E se alguém escolher a senha ');DROP TABLE users; -- ? Essa é uma senha bastante segura, não é? Limpar suas entradas - e fazer isso no shell é uma dor, por isso não use shell para esta tarefa . Para mais detalhes, consulte este livro:

    
por 12.08.2016 / 03:47

Tags