2013-07-23 75 views
1

试图获得一个mysqldump脚本,它使用包含空格的备份用户密码;如果我有选择,我只是改变它,但我没有。Bash:包含文字单引号的字符串变量

头在旋转试图理清Bash和报价的精彩世界,只需要进行下列操作执行...

mysql -u backupuser -p'This is a terrible password with spaces' -e ...

...但有变量,而不是:

MYPASS="'This is a terrible password with spaces'"(< - 这一点,约9307变化我试过不工作)

mysql -u backupuser -p$MYPASS -e ...

回答

4

通过命令行传递密码被认为是不安全的,因为其他用户可以使用ps afx/proc文件系统以明文形式查看密码。我最近写了一个关于这个话题的blog post

然而,为了使命令只是工作需要双引号"各地$MYPASS防止解释空间无法相依密码多重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脚本,他们将无法以纯文本格式查看密码。

+0

美得到密码是谁登录到机器的每个用户。谢谢。 – gravyface

+0

讨厌挑剔,但是你能澄清一下评论:“用猫和这里的文件一起通过......”? – gravyface

+0

@gravyface你有没有在编辑器的命令行上用'cat < file'写过一个文件?我问,因为如果你知道你会知道我的意思..顺便说一下,我承认,即使没有'猫'只有在这里doc可以完成。 – hek2mgl

1

我会去与

mysql -u backupuser -p -e ... 

,并在提示提供密码,而不是将其放入了CMDLINE ARGS。

如果指定的密码作为参数来mysql,实际上当你运行该脚本可以使用简单ps aux

+0

如果需要输入密码,很难自动化。 'expect'在这里会有所帮助。检查我的回答 – hek2mgl

+0

@ hek2mgl是真的,尽管OP没有真正说出剧本的用途。我主要想指出的是,使用OP所建议的密码本质上是不安全的。是的,如果你需要脚本自行运行,'expect'是一个很好的解决方案。 –

+0

好的。如果脚本不应该被自动调用,这意味着它只是交互式使用的想法,您的解决方案是最好的,因为它不需要以纯文本存储密码.. +1;)但是当用户讲述备份问题,我不指望它是用于交互式使用。但是,我们目前还不知道 – hek2mgl

相关问题