我阅读了无数关于此的主题,但没有一个解决这个问题。
我需要在命令行上执行一个 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
扩展,我看到三个选项:
- 使用单引号而不是双引号(但是你需要在语句中转义单引号!所以你仍然需要适当地处理逃跑!
- 使用不同的 shell,一个不支持的 shell
$variables
(我不知道有什么好的 shell 不支持) - 实际上使用变量而不是对你有利(但要注意,你仍然需要处理 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 来完成此任务。更详细的内容可以参考这本书: