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
更多详情printf
:
wiki.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"