使用终端内的mysql抑制警告消息,但用bash脚本编写密码

Bla*_*ard 240 mysql bash shell

当我尝试从终端内的MySQL上运行以下命令时:

mysql -u $user -p$password -e "statement"
Run Code Online (Sandbox Code Playgroud)

执行按预期工作,但它总是发出警告:

警告:在命令行界面上使用密码可能不安全.

但是,我必须使用$password存储我的密码的环境变量()来执行上面的声明,因为我想在终端内的bash脚本中迭代地运行命令,我绝对不喜欢等待提示出现的想法并强迫我在一个脚本中输入50或100次密码.所以这是我的问题:

  • 抑制警告是否可行?该命令正如我所说的那样正常工作,但当我循环并运行命令50或100次时,窗口变得非常混乱.

  • 我是否应该遵守警告信息并且不在我的脚本中写入密码?如果是这种情况,那么每次提示迫使我这样做时,我是否必须输入密码?

跑步man mysql没有帮助,只说

--show-warnings
如果有任何声明,则会在每个声明后显示警告.此选项适用于交互式和批处理模式.

如果我没有遗漏某些东西,并且没有提及如何关闭功能.

我在OS X 10.9.1 Mavericks上,并使用自制的MySQL 5.6.

Cri*_*rta 231

如果您的MySQL客户端/服务器版本是5.6.xa,以避免WARNING消息使用mysql_config_editor工具:

mysql_config_editor set --login-path=local --host=localhost --user=username --password
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的shell脚本中使用:

mysql --login-path=local  -e "statement"
Run Code Online (Sandbox Code Playgroud)

代替:

mysql -u username -p pass -e "statement"
Run Code Online (Sandbox Code Playgroud)

  • 请记住,` - login-path`必须先于所有其他参数.我正在尝试`mysqldump --tables --login-path = local`并得到错误`unknown variable'login-path = local'`. (26认同)
  • 如果我们直接执行 shell 文件,这可以正常工作,但如果从 crontab 调用则无法正常工作 (2认同)
  • 那么,在所有这些评论之后,适用于从 crontab 调用的脚本的解决方案是什么? (2认同)

Dav*_*win 193

我使用类似的东西:

mysql --defaults-extra-file=/path/to/config.cnf
Run Code Online (Sandbox Code Playgroud)

要么

mysqldump --defaults-extra-file=/path/to/config.cnf 
Run Code Online (Sandbox Code Playgroud)

config.cnf包含的位置:

[client]
user = whatever
password = whatever
host = whatever
Run Code Online (Sandbox Code Playgroud)

这允许您拥有多个配置文件 - 用于不同的服务器/角色/数据库.使用〜/ .my.cnf只允许你有一组配置(虽然它可能是一组有用的默认值).

如果您使用的是基于Debian的发行版,并以root用户身份运行,则可以跳过上述内容并使用/etc/mysql/debian.cnf进入...:

mysql --defaults-extra-file=/etc/mysql/debian.cnf

  • 制作临时.cnf文件的另一种方法是在Bash中执行此操作:`mysql --defaults-extra-file = <(printf"[client] \nuser =%s \npassword =%s""$ user""$ pwd") - e"声明"`.由于'printf`是由Bash直接执行的,它不会出现在`ps`中. (21认同)
  • 注意:`--defaults-extra-file`必须是第一个选项,否则mysql会抱怨`mysqldump:unknown variable'defaults-extra-file`. (11认同)
  • 接受答案的真棒替代方案.绝对不要设置`MYSQL_PWD`变量.... (4认同)
  • 我需要使用`--defaults-file`而不是`--defaults-extra-file`,因为后者优先考虑〜/ .my.cnf中的设置. (3认同)

Iva*_*kov 174

一种方便(但同样不安全)的方法是使用:

MYSQL_PWD=xxxxxxxx mysql -u root -e "statement"
Run Code Online (Sandbox Code Playgroud)

请注意,官方文档建议不要使用它.
请参见6.1.2.1密码安全的最终用户指南(适用于5.6版的Mysql手册):

将密码存储在MYSQL_PWD环境变量中

这种指定MySQL密码的方法必须被认为是非常不安全的,不应该使用.某些版本的ps包含显示正在运行的进程环境的选项.在某些系统上,如果设置MYSQL_PWD,则密码将暴露给运行ps的任何其他用户.即使在没有这种版本的ps的系统上,假设用户没有其他方法可以检查过程环境也是不明智的.

  • 在脚本中,您需要`export MYSQL_PWD = whatever`. (22认同)
  • 在一个脚本中,你不需要运行`export`,只需将它全部放在一行:`MYSQL_PWD = xxxxxxxx mysql -u root -e"statement"` (9认同)
  • 从 mysql 8.0 开始,MYSQL_PWD 已被弃用,请参见此处 https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html (6认同)
  • 这在我的bash脚本中不起作用:`访问被拒绝用户'root'@'localhost'(使用密码:NO) (5认同)
  • 因为我的查询非常快,所以我选择了这个选项.然后我在执行查询后将其设置为虚假. (2认同)
  • MYSQL_PWD 在 5.5、5.6 和 5.7 客户端文档中有记录,但在 8.0 文档中被省略。 (2认同)

joh*_*tfx 61

如果您希望在命令行中使用密码,我发现这适用于过滤掉特定的错误消息:

mysqlcommand 2>&1 | grep -v "Warning: Using a password"
Run Code Online (Sandbox Code Playgroud)

它基本上将标准错误重定向到标准输出 - 并使用grep删除所有符合"警告:使用密码"的行.

这样,您可以看到任何其他输出,包括错误.我将它用于各种shell脚本等.

  • 与这里的其他解决方案相比,这是一个非常糟糕的解决方案。如果文本发生更改,任何后续版本的 MySQL 都可能会失败,也可能无法在其他语言环境中工作。 (4认同)
  • 静音该消息非常简单,无需在MySQL安装程序中进行任何操作。 (2认同)
  • 我如何将它与 mysqldump 一起使用,其中我已经有 SQL 的重定向? (2认同)
  • 请注意,警告文本可能会更改 [警告] 使用密码 警告:使用密码 (2认同)

But*_*kus 40

这是我如何让我的每日mysqldump数据库备份的bash脚本更安全地工作.这是Cristian Porta伟大答案的扩展.

  1. 首先使用mysql_config_editor(自带mysql 5.6+)来设置加密密码文件.假设您的用户名是"db_user".从shell提示符运行:

    mysql_config_editor set --login-path=local --host=localhost --user=db_user --password
    
    Run Code Online (Sandbox Code Playgroud)

    它会提示输入密码.输入后,用户/通行证将以加密方式保存home/system_username/.mylogin.cnf

    当然,将"system_username"更改为服务器上的用户名.

  2. 从这个改变你的bash脚本:

    mysqldump -u db_user -pInsecurePassword my_database | gzip > db_backup.tar.gz
    
    Run Code Online (Sandbox Code Playgroud)

    对此:

    mysqldump --login-path=local my_database | gzip > db_backup.tar.gz
    
    Run Code Online (Sandbox Code Playgroud)

没有更多暴露的密码.


nur*_*zin 12

这很简单。这对我来说是工作。

export MYSQL_PWD=password; mysql --user=username -e "statement"
Run Code Online (Sandbox Code Playgroud)

MYSQL_PWD是来自mysql的环境变量之一。这是连接到mysqld时的默认密码。

  • 不推荐使用“MYSQL_PWD”环境变量来指定 MySQL 密码。 (2认同)

Jav*_*Guy 10

最简单的方法是

mysql -u root -pMYPASSWORD -e "show databases" 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

  • 问题是这也会抑制脚本中的合法错误. (40认同)
  • 使用`2&gt;/dev/null | grep -v "mysql: [警告] 在命令行界面上使用密码可能不安全。"` 仅抑制有问题的警告 (5认同)
  • 您还可以创建日志文件2> /var/log/myscript.log来记录该错误. (4认同)
  • 由于 2&gt;/dev/null 已经重定向到 /dev/null - grep 在那里没有做任何事情。重定向需要转到 2&gt;&amp;1 来过滤掉这个单一警告。 (4认同)

小智 9

您还可以在脚本中运行mysql_config_editor,以在指定登录路径时传入密码

expect -c "
spawn mysql_config_editor set --login-path=$mySqlUser --host=localhost --user=$mySqlUser --password
expect -nocase \"Enter password:\" {send \"$mySqlPassword\r\"; interact}
"
Run Code Online (Sandbox Code Playgroud)

这将启动一个期望会话,该会话可以在脚本中用于与提示进行交互

看这篇文章


san*_*zti 8

好的,没有临时文件或任何东西的解决方案:

mysql --defaults-extra-file=<(echo $'[client]\npassword='"$password") -u $user -e "statement"
Run Code Online (Sandbox Code Playgroud)

它与其他人提到的类似,但在这里您不需要实际文件,这部分命令伪造文件:(<(echo ...) 注意中间没有空格<(

  • 如果您的“~/.”中已经有一个带有密码条目的“.my.cnf”文件,则此操作不起作用 (2认同)

小智 6

一个简单的变通脚本。将此命名为“mysql”,并将其放在“/usr/bin”之前的路径中。其他命令的明显变体,或者警告文本不同。

#!/bin/sh

(
(
(
(
(
    /usr/bin/mysql "$@"
) 1>&9 
) 2>&1
) | fgrep -v 'mysql: [Warning] Using a password on the command line interface can be insecure.'
) 1>&2 
) 9>&1
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个答案有点令人费解,但我只是赞成它,因为看到没有明确错误的答案或有点非常规的答案而没有评论,这让我感到非常难过!难怪大卫没有回答任何其他问题!他跳了进去,试图帮助提供一个新颖的解决方案,但被猛烈抨击,没有解释原因!FU匿名downvoters谁不发表评论! (4认同)
  • +1 同意杰里米戴维斯。这是令人费解的,但是当没有其他选择时,这可能是可以接受的。这绝对没有错,不像关闭警告,这是有史以来最愚蠢的想法! (3认同)

Jos*_*hih 6

您也可以将标准错误 STDERR 输出重定向到 /dev/null

所以只需这样做:

mysql -u $user -p$password -e "statement" 2> /dev/null

  • 我会避免这种方法,因为它会使合法错误更难以捕捉 (14认同)

小智 5

shell> mysql_config_editor set --login-path=local
     --host=localhost --user=localuser --password
Enter password: enter password "localpass" here
shell> mysql_config_editor set --login-path=remote
     --host=remote.example.com --user=remoteuser --password
Enter password: enter password "remotepass" here
Run Code Online (Sandbox Code Playgroud)

要查看mysql_config_editor写入.mylogin.cnf文件的内容,请使用print命令:

shell> mysql_config_editor print --all
[local]
user = localuser
password = *****
host = localhost
[remote]
user = remoteuser
password = *****
host = remote.example.com
Run Code Online (Sandbox Code Playgroud)

print命令将每个登录路径显示为一组行,以组标题开头,在方括号中指示登录路径名称,后跟登录路径的选项值。密码值被屏蔽,并且不会显示为明文。

如前面的示例所示,.mylogin.cnf文件可以包含多个登录路径。这样,mysql_config_editor可以轻松设置多个“个性”以连接到不同的MySQL服务器。当调用客户端程序时,以后可以使用--login-path选项按名称选择其中任何一个。例如,要连接到本地服务器,请使用以下命令:

shell> mysql --login-path=local
Run Code Online (Sandbox Code Playgroud)

要连接到远程服务器,请使用以下命令:

shell> mysql --login-path=remote
Run Code Online (Sandbox Code Playgroud)


Nes*_*iza 5

来自https://gist.github.com/nestoru/4f684f206c399894952d

# Let us consider the following typical mysql backup script:
mysqldump --routines --no-data -h $mysqlHost -P $mysqlPort -u $mysqlUser -p$mysqlPassword $database

# It succeeds but stderr will get:
# Warning: Using a password on the command line interface can be insecure.
# You can fix this with the below hack:
credentialsFile=/mysql-credentials.cnf
echo "[client]" > $credentialsFile
echo "user=$mysqlUser" >> $credentialsFile
echo "password=$mysqlPassword" >> $credentialsFile
echo "host=$mysqlHost" >> $credentialsFile
mysqldump --defaults-extra-file=$credentialsFile --routines --no-data $database

# This should not be IMO an error. It is just a 'considered best practice'
# Read more from http://thinkinginsoftware.blogspot.com/2015/10/solution-for-mysql-warning-using.html
Run Code Online (Sandbox Code Playgroud)