通过命令行传递密码被认为是不安全的,因为其他用户可以使用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 脚本,他们将无法以纯文本形式查看密码。