包含特殊字符的密码的数据库复制 shell 脚本

包含特殊字符的密码的数据库复制 shell 脚本

mysqldump我正在尝试为(and ) 操作创建一个 shell 脚本mysql,其中密码直接存储在脚本中。密码包含需要相应处理的特殊字符。但是,我无法找出真正有效的组合。

例如,执行以下命令直接地在控制台上:

mysqldump -u the_user --hex-blob --add-drop-table source_db --password=the\$password | mysql -u the_user target_db --password=the\$password

密码包含 ,$然后使用 进行转义\$。但是,将完全相同的命令放入 时不起作用shell_script.sh。当我执行脚本时,MySQL 会抱怨

Access denied for user 'the_user'@'localhost'

到目前为止,我已经在脚本中尝试了以下内容:

mysqldump -u the_user --hex-blob --add-drop-table source_db --password=the\$password | mysql -u the_user target_db --password=the\$password

mysqldump -u the_user --hex-blob --add-drop-table source_db --password="the\$password" | mysql -u the_user target_db --password="the\$password"

mysqldump -u the_user --hex-blob --add-drop-table source_db --password='the\$password' | mysql -u the_user target_db --password='the\$password'

mysqldump -u the_user --hex-blob --add-drop-table source_db --password="the$password" | mysql -u the_user target_db --password="the$password"

mysqldump -u the_user --hex-blob --add-drop-table source_db --password='the$password' | mysql -u the_user target_db --password='the$password'

这些方法似乎都不能正确地转义密码。其中,只有第一个在 shell 上直接使用时可以正常工作。

我遗漏了什么?我该如何指定密码,以便这些命令也可以在 shell 脚本中运行?

答案1

我会做以下事情:

printf -v password "%q" "\$password"
mysql --password=$password

更多详情printfwiki.bash-hackers.org 上的 printf

答案2

尝试将密码(不带换行符和转义符)放入文本文件中pass.txt,然后使用以下命令

mysqldump -u the_user --hex-blob --add-drop-table source_db --password=$(cat pass.txt) | mysql -u the_user target_db --password=$(cat pass.txt)

答案3

将密码添加到 SQL ini 文件的单独部分[mysqldump]。如果您也需要它用于 MYSQL 调用,请将其[mysql]也添加到 ini 文件的相应部分。

[mysqldump]
password="the$password"

[mysql]
password="the$password"

相关内容