当我在终端内尝试在MySQL上运行以下命令时:
mysql -u $user -p$password -e "statement"
执行按预期工作,但它总是发出警告:
警告:在命令行界面上使用密码可能不安全 .
但是,我必须使用存储我的密码的环境变量( $password
)来执行上述语句,因为我想在终端内的bash脚本中迭代地运行命令,我绝对不会回答我的问题:
-
抑制警告是否可行?正如我所说,该命令正常工作,但当我循环并运行命令50或100次时,窗口变得非常混乱 .
-
我是否应该遵守警告信息并且不在我的脚本中写入密码?如果是这种情况,那么每次提示强制我这样做时,我是否必须输入密码?
运行 man mysql
没有帮助,只说
--show-warnings如果有任何声明,则会在每个声明后显示警告 . 此选项适用于交互式和批处理模式 .
如果我没有遗漏某些东西,并且没有提及如何关闭功能 .
我在OS X 10.9.1 Mavericks上,并使用自制的MySQL 5.6 .
19 回答
如果您的MySQL客户端/服务器版本是5.6.x,则可以使用 mysql_config_editor 工具来避免WARNING消息:
然后你可以在你的shell脚本中使用:
代替:
我使用类似的东西:
要么
config.cnf包含的位置:
这允许您拥有多个配置文件 - 用于不同的服务器/角色/数据库 . 使用〜/ .my.cnf只允许你有一组配置(虽然它可能是一组有用的默认值) .
如果您使用的是基于Debian的发行版,并以root身份运行,则可以跳过上述内容并使用/etc/mysql/debian.cnf进入...:
mysql --defaults-extra-file=/etc/mysql/debian.cnf
一种方便(但同样不安全)的方法是使用:
请注意,官方文档建议不要使用它 .
见6.1.2.1 End-User Guidelines for Password Security (Mysql Manual for Version 5.6):
如果您希望在命令行中使用密码,我发现这适用于过滤掉特定的错误消息:
它基本上将标准错误重定向到标准输出 - 并使用grep删除所有符合“警告:使用密码”的行 .
这样,您可以看到任何其他输出,包括错误 . 我将它用于各种shell脚本等 .
以下是我为每日mysqldump数据库备份获取bash脚本以更安全地工作的方法 . 这是Cristian Porta伟大答案的扩展 .
它会提示输入密码 . 输入后,用户/通行证将以加密方式保存在
home/system_username/.mylogin.cnf
中当然,将“system_username”更改为服务器上的用户名 .
对此:
没有更多暴露的密码 .
最简单的方法是
您还可以在脚本中运行mysql_config_editor,以在指定登录路径时传入密码
这将启动一个期望会话,该会话可以在脚本中用于与提示进行交互
See this post
来自https://gist.github.com/nestoru/4f684f206c399894952d
要查看mysql_config_editor写入.mylogin.cnf文件的内容,请使用print命令:
print命令将每个登录路径显示为一组行,以一个组头开头,表示方括号中的登录路径名,后跟登录路径的选项值 . 密码值被屏蔽,不会显示为明文 .
如前面的示例所示,.mylogin.cnf文件可以包含多个登录路径 . 通过这种方式,mysql_config_editor可以轻松设置多个“个性”以连接到不同的MySQL服务器 . 当您调用客户端程序时,可以稍后使用--login-path选项按名称选择其中任何一个 . 例如,要连接到本地服务器,请使用以下命令:
要连接到远程服务器,请使用以下命令:
另一种方法是使用sshpass来调用mysql,例如:
这是脚本/ bin / sh中Docker的解决方案:
替换[MYSQL_CONTAINER_NAME]并确保在容器中设置了环境变量MYSQL_ROOT_PASSWORD .
希望它会帮助你,它可以帮助我!
您也可以将标准错误STDERR输出重定向到/ dev / null
所以这样做:
mysql -u $user -p$password -e "statement" 2> /dev/null
就个人而言,我使用脚本包装器来捕获该错误 . 这是代码示例:
一个简单的workaroud脚本 . 将此命名为“mysql”,并将其放在“/ usr / bin”之前的路径中 . 其他命令的明显变体,或警告文本不同 .
对于PowerShell(
pwsh
,而不是bash
),这是一个非常棒的解决方案......我的第一次尝试是将mysql
的调用包装在一个try/catch
函数中,但是由于某些strange behavior in PowerShell error handling,这是不可行的 .解决方案是覆盖
$ErrorActionPreference
只需要足够长的时间来组合并捕获STDERR
和STDOUT
并解析单词ERROR
并根据需要重新抛出 . 我们无法在"^mysql.*Warning.*password"
上捕获和释放的原因是因为PowerShell处理并将错误提升为一个流,因此您需要 must capture it all 才能过滤和重新抛出 . :/Note: PowerShell适用于Unix,因此该解决方案是跨平台的 . 它可以通过一些小的语法修改来适应
bash
.Warning: 有几十个边缘情况,这些不起作用,例如非英语错误消息或在输出中的任何地方返回单词
ERROR
的语句,但它足以吞下警告,以便在没有轰炸的情况下对mysql
进行基本调用整个脚本 . 希望其他人觉得这很有用 .如果
mysql
只是添加一个选项来抑制此警告,那就太好了 .另一种解决方案(例如来自脚本):
-i''
选项用于兼容Mac OS X.标准UNIX操作系统可以直接使用-i
我遇到的问题是在bash脚本中使用条件输出 .
这不是很优雅,但在docker env中这应该没关系 . 基本上所有这一切都忽略了最后一行没有的输出 . 您可以使用awk执行类似操作,并更改为返回除第一行之外的所有内容等 .
这只返回最后一行
它不会抑制错误,但它会确保您可以在bash脚本中使用查询的输出 .
您可以使用/ dev / null执行mySQL并禁止显示警告和错误消息,例如:
哪里:
请享用!
它对我有用 - 只需在
$(mysql_command)
之后添加2> null
,它将仅抑制错误和警告消息 .