试图让mysqldump
脚本使用包含空格的备份用户密码;如果我有一个选择,我只是改变它,但我不会。
Head正在旋转试图理清Bash和引号的奇妙世界,只需要执行以下操作......
mysql -u backupuser -p'This is a terrible password with spaces' -e ...
...但改为使用变量:
MYPASS="'This is a terrible password with spaces'"
(< - 这个,以及我试过的大约9,307种变种都不起作用)
mysql -u backupuser -p$MYPASS -e ...
答案 0 :(得分:4)
通过命令行传递密码被认为是不安全的,因为其他用户可以使用ps afx
或/proc
文件系统以纯文本形式查看密码。我最近写了一篇关于这个主题的blog post。
但是,要使命令正常工作,它需要"
周围的双引号$MYPASS
,以防止bash将空格分离的密码解释为多个args:
MYPASS="foo bar password"
mysql -u backupuser -p"$MYPASS" -e ...
但我强烈建议使用以下解决方案,使用expect
将密码传递给mysqldump
:
#!/bin/bash
# mysql credentials and connection data
db_host="localhost"
db_name="testdb"
db_user="jon"
db_pass="secret"
# I'm using a here-document to pass commands to expect.
# (the commands could be stored in a file as well)
expect <<EOF
# disable command output
log_user 0
# start the mysqldump process
spawn mysqldump -h$db_host -u$db_user -p $db_name
# wait for the password prompt
expect "password:"
# send the password (mind the \r)
send "$db_pass\r"
# enable output again
log_user 1
# echo all outout until the end
expect eof
EOF
expect
将以人类用户的方式传递密码:在提示输入密码后,它会将其写入mysqldump
的标准输入。如果您确保其他用户无法访问except脚本,则他们将无法以纯文本格式查看密码。
答案 1 :(得分:1)
我会选择
mysql -u backupuser -p -e ...
并在提示符处提供密码,而不是将其放入cmdline args。
如果您将密码指定为mysql
的参数,几乎每个在您运行脚本时登录到计算机的用户都可以使用简单的ps aux