【问题标题】:MySQL prompts for the password when using heredoc [duplicate]MySQL在使用heredoc时提示输入密码[重复]
【发布时间】:2015-02-21 05:25:03
【问题描述】:

我正在尝试执行一个shell脚本以root身份登录mysql并执行一些命令,为了避免将root的密码放在命令行中,我使用heredoc格式,如下所示。 然而,mysql 提示我输入密码,尽管我给了它正确的密码。

完全相同的语法在其他一些主机上也能完美运行,但在这里却不行。

为什么?

mysql@myhost:MySQL> mysql -uroot -p -s -P3306 -e 'SELECT NOW();'  <<EOF
> MyPassword
> EOF
Enter password:    <---- why does it require manual password entry in here?
2014-12-23 14:57:25

【问题讨论】:

  • MySQL 在读取密码之前总是显示提示。它不关心输入是来自终端还是来自here-doc。
  • @Barmar 是的,这是正确的。我想我需要澄清这个问题:在其他主机中,mysql提示“输入密码:”但它并没有停止;它只接受已经给定的密码。但是,在这种情况下,它会停在那里并等待手动输入密码。
  • 你说得对,我在我的 Linux 系统上看到了这一点。它必须从/dev/tty而不是stdin读取密码。
  • 您是否考虑过使用.my.cnf 文件而不是将密码放入脚本中?
  • @Barmar 不!但我试图避免它,因为我不应该对主机进行任何更改。顺便说一句......我试图让这个例子更清楚。感谢您的有用评论。

标签: mysql heredoc


【解决方案1】:

假设您使用 BASH 或 KSH 命令行界面:

read -s pwd;mysql -uroot --password=${pwd} -s -P3306 -e 'SELECT NOW();'

对于读取命令,您应该使用 -s 选项,因为在使用 heredoc 时会发生这种情况,如果您不使用该选项,此解决方案也会在输入密码时显示密码。

此解决方案之所以有效,是因为 mysql 客户端会混淆密码,因此它不会显示在进程列表命令的输出中,例如 ps。运行这个:

read -s pwd;mysql -uroot --password=${pwd} -s -P3306

然后,如果你打开一个额外的命令行界面并执行ps,你会看到它没有显示密码,而是它的混淆版本,在进程列表。

这是当时 mysql 客户端的一个著名错误,但在 2002 年得到了修复。

使用 read -s 将密码放入变量中的另一个好处是不会在命令行界面的历史记录中显示密码

【讨论】:

  • 他说他不想把密码放在命令行上。大概是因为它出现在ps 输出中。
  • 这绝对不是真的! “mysql”客户端专门混淆了命令行中提供的密码文本,因此它在“ps”的输出中显示如下:mysql -uroot --password=x xxxxxxxxxxxxxx -s。我不值得那个-1。请谁给我那个-1(我是新手),检查你的事实。在单独的控制台上执行“ps”并亲自查看。此外,使用此方法,密码不会显示在“历史”命令的输出中。
  • 您需要编辑答案,以便让我删除我的反对票。
  • 按要求编辑了答案。提前致谢。
猜你喜欢
  • 2021-08-09
  • 2012-10-10
  • 2011-10-17
  • 2011-04-17
  • 2022-01-25
  • 2017-12-03
  • 2015-03-30
  • 2019-02-05
  • 2014-09-16
相关资源
最近更新 更多