2

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

4

2 回答 2

4

通过命令行传递密码被认为是不安全的,因为其他用户可以使用ps afx/proc文件系统以纯文本形式看到密码。我最近写了一篇关于这个主题的博客文章。

但是,要使命令正常工作,它需要双引号"$MYPASS防止 bash 将空格分隔的密码解释为多个参数:

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 脚本,他们将无法以纯文本形式查看密码。

于 2013-07-23T15:04:54.693 回答
1

我会去

mysql -u backupuser -p -e ...

并在提示符处提供密码,而不是将其放入 cmdline 参数中。

如果您将密码指定为 的参数mysql,则几乎每个在您运行脚本时登录机器的用户都可以使用简单的ps aux

于 2013-07-23T15:14:04.760 回答