为什么我不能以非交互方式将密码输入mysql?

时间:2016-11-17 14:29:13

标签: mysql

我想运行mysql客户端,以非交互方式提供密码。

标准解决方案就是这个

mysql -u root -e "foo" -p < password_file

但我的情况是这个

produce_password | mysql -u root -p

这里,即使正在传输数据,mysql也会提示输入密码。(是的,produce_password正在发送数据; echo foo | mysql的行为方式相同。)

互联网似乎认为上述内容应该有效,但实际情况并非如此。解决方法是

produce_password > password_file
mysql -u root -p < password_file
rm password_file

但是,让我们说我不想这样做(例如政策要求此密码永远不会写入磁盘)

如何让mysql从输入过程中获取密码而不提示,就像文件一样?

4 个答案:

答案 0 :(得分:1)

我不知道如何解释这个问题,但是当你输入一些内容时,第一个程序的stdout会被转发到第二个程序的stdin。你以某种方式混淆了这个,用命令行或其他什么。当然,您可以将某些内容传递给mysql,但无论您管道是什么,都经过处理,您已经对自己进行了身份验证。

解决方案是

mysql -u root -p$(produce_password)

这会使用您在那里的任何程序生成您的密码并将其放在命令行上的正确位置(我的英语很糟糕,无法解释得更好)。如果你在文件中有它可以做

mysql -u root -p$(cat file)

我不知道为什么你想这样做,但是你可能有兴趣拥有一个带有你的凭据的加密文件,你可以用来登录而不指定密码。阅读更多相关信息here

答案 1 :(得分:1)

感谢fancyPants解释原因,这是一个符合我要求的解决方案。 (加密的.mylogin.cnf mysql_config_editor并不适合我,但谢谢。)

要满足安全策略,请将/ramfs挂载为ramfs临时文件系统。假设文件权限具有适当的限制性。

ramdir="/ramfs"
cnf="$(mktemp "$ramdir/this-script-name-XXXXX")"
pw="$(produce_password)"

cat >"$cnf" <<EOF
[client]
user=root
password="$pw"
EOF

mysql --defaults-extra-file="$cnf" -e 'select 1'

rm "$cnf"

答案 2 :(得分:0)

问题在于密码显示在进程列表中。 但是你可以做到这一点。

mysql --defaults-file = <(echo'[client]'; echo'user = USERNAME'; echo“ password = $ mysqlpassword”;)

它像这样显示在进程列表中。

mysql --defaults-file = / dev / fd / 63

,因此<()为您的命令输出创建文件句柄。 这适用于需要文件的命令行选项。

答案 3 :(得分:0)

最简单的方法是声明 the environment variable MYSQL_PWD

示例:

$ export MYSQL_PWD=$(produce the password if required)
$ mysql -h example.org -u username

请记住,在这种情况下不应使用 -p