如何在命令行上禁用 $ 字符转义

如何在命令行上禁用 $ 字符转义

我阅读了无数关于此的主题,但没有一个解决这个问题。

我需要在命令行上执行一个 MySQL 表达式,该表达式包含转义$的内容,因此会破坏 MySQL 的行为

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

有人告诉我去检查一下printf

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

所以我不需要转义,$否则错误的密码会被输入到 MySQL 查询中。

答案1

您误解了一些机制。

当您将短语放在单引号中时, ie ',没有扩展,并且您不必转义 s $。扩展意味着存在特殊字符$,例如 ,如果未转义,则会触发特殊的 shell 过程。因此,当您使用单引号抑制扩展时,不需要转义它们。因此使用:

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

至于printf,你所做的并不是检查。调用它时会在 s%q上添加反斜杠$

如果某些东西不起作用,那是因为$$更改为 shell 的 PID(进程 ID)。这就是 shell 在正常上下文中对特殊字符的组合进行的处理,即。当它们没有转义或放在单引号内时。

答案2

这对我有帮助,

$ mysql -uroot -p'secret' -e "UPDATE users SET
password='pa\$\$word',email='[email protected]' WHERE id = 1;"

答案3

如果您不想$variable扩展,我看到三个选项:

  1. 使用单引号而不是双引号(但是你需要在语句中转义单引号!所以你仍然需要适当地处理逃跑!
  2. 使用不同的 shell,一个不支持的 shell $variables(我不知道有什么好的 shell 不支持)
  3. 实际上使用变量而不是对你有利(但要注意,你仍然需要处理 SQL 转义以避免 sql 注入攻击):

也就是说,您可以这样做(请注意,设置变量的确切概念因您的 shell 而异!下面未经测试,只是为了给出想法):

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

使用准备好的语句以及为此设计的编程语言,而不是 shell 脚本。它破裂的可能性要小得多。

记住小鲍比桌子。如果有人选择密码怎么办');DROP TABLE users; --?这是一个非常安全的密码,不是吗?清理你的输入 - 在 shell 中这样做很痛苦,所以不要使用 shell 来完成此任务。更详细的内容可以参考这本书: 奥利掉落餐桌动物

相关内容