Bash:包含文字单引号的字符串变量

时间:2013-07-23 15:02:14

标签: bash quotes string-literals

试图让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 ...

2 个答案:

答案 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

获取密码