无论是开发,还是运维,可能我们都写过Linux Shell脚本访问数据库的逻辑,以MySQL为例,登录MySQL数据库时,他会返回一些告警信息,如何优雅地屏蔽这些提示?看到了爱可生开源社区中杨老师的这篇文章《技术分享 | MySQL 编写脚本时避免烦人的警告》(版权归属:爱可生开源社区),提到了如何在Linux Shell下调用MySQL各种命令行工具时屏蔽掉烦人的告警信息输出,诸如下面这样,

root@ytt-ubuntu18:/home/ytt# mysql -uytt -proot -e "select version()"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-----------+
| version() |
+-----------+
| 8.0.29    |
+-----------+

这样的告警信息对命令执行结果的输出非常不友好,那么我们如何屏蔽掉他?

下面罗列下几种能想到的方法,以供参考。

(1) 给用户空密码(不推荐)

给用户赋予空密码虽然可以屏蔽掉警告信息,但极不安全,类似于MySQL服务初始化时的--initialize-insecure选项。

root@ytt-ubuntu18:/home/ytt# mysql -u ytt_no_pass -e "select user()"
+-----------------------+
| user()                |
+-----------------------+
| ytt_no_pass@localhost |
+-----------------------+

(2) 配置文件不同块加入用户名密码(不推荐)

MySQL的配置文件有my.cnf、mysql.cnf、mysqld.cnf等,只要在这些配置文件里的不同块下添加对应的用户名和密码即可。

root@ytt-ubuntu18:/home/ytt# cat /etc/mysql/conf.d/mysql.cnf
[mysql]
prompt=mysql:\d:\v>
user=ytt
password=root
port=3340
[mysqldump]
user=ytt
password=root
port=3340[mysqladmin]
user=ytt
password=root
port=3340

以上[mysql]块下的内容表示对mysql命令行生效,[mysqldump]块下的内容表示对mysqldump工具生效,[mysqladmin]块下的内容表示对mysqladmin工具生效。或者写简单点,统一加到[client]里,表示对所有客户端生效。注意只能把共享的部分内容加到这里。

root@ytt-ubuntu18:/home/ytt# cat /etc/mysql/conf.d/mysql.cnf
[mysql]
prompt=mysql:\d:\v>
[client]
user=ytt
password=root
port=3340

由于这些块都是针对客户端设置,不需要重启 MySQL 服务,可立即生效。

root@ytt-ubuntu18:/home/ytt# mysql -e "select user()"
+---------------+
| user()        |
+---------------+
| ytt@localhost |
+---------------+

(3) 设置MySQL环境变量(不推荐)

MySQL有一些内置环境变量,对所有客户端生效。

官方的环境变量列表如下,

https://dev.mysql.com/doc/refman/8.0/en/environment-variables.html

给当前用户设置所需的环境变量,之后再调用命令行工具即可。例如设置密码环境变量MYSQL_PWD 、传统TCP端口环境变量MYSQL_TCP_PORT等。

root@ytt-ubuntu18:/home/ytt# export MYSQL_PWD=root MYSQL_TCP_PORT=3340 root@ytt-ubuntu18:/home/ytt# mysql -uytt -e "select user()"
+---------------+
| user()        |
+---------------+
| ytt@localhost |
+---------------+

此方法也不推荐使用,环境变量MYSQL_PWD容易被其他用户获取。例如直接用ps命令就可以轻易获取MYSQL_PWD的值。

用户1执行如下命令,

root@ytt-ubuntu18:/home/ytt# mysql -uytt -e "select sleep(1000)"

用户2执行ps aex就可以打印出环境变量MYSQL_PWD和MYSQL_TCP_PORT的值,

root@ytt-ubuntu18:/home/ytt# ps aex| grep MYSQL_PWD| grep -v 'grep'
7592 pts/0    S+     0:00 mysql -uytt -e select sleep(1000) LS_COLORS=rs=0:... MYSQL_PWD=root ...MYSQL_TCP_PORT=3340 ...

(4) 屏蔽标准错误输出内容,重定向到空设备文件(推荐)

root@ytt-ubuntu18:/home/ytt# mysql -uytt -proot -P3340 -e"select version()"  2>/dev/null
+-----------+
| version() |
+-----------+
| 8.0.29    |
+-----------+

这里利用Linux系统本身的特性来重定向MySQL错误信息,其中数字2代表错误输出的文件描述符,/dev/null代表空设备。

就是说将执行这条命令的错误信息重定向到空设备而不是标准输出,这样就可以变相的把警告信息屏蔽掉。

(5) 使用mysql_config_edit工具生成不同的login_path(推荐)

mysql_config_edit是MySQL 官方发布的一款工具,专门处理这类必须暴露用户密码的问题,可以进行一次设置,多次安全使用。

使用方法如下:设置一个login_path,名字为user_ytt ,密码按提示输入即可。

root@ytt-ubuntu18:/home/ytt# mysql_config_editor set -G user_ytt -S /var/run/mysqld/mysqld.sock -u ytt -p
Enter password:

接下来,调用任何MySQL命令行工具只需要带上--login-path选项即可使用。

root@ytt-ubuntu18:/home/ytt# mysql --login-path=user_ytt -e 'select user()'
+---------------+
| user()        |
+---------------+
| ytt@localhost |
+---------------+root@ytt-ubuntu18:/home/ytt# mysqladmin  --login-path=user_ytt ping
mysqld is alive

mysql_config_editor工具也有一个缺点:同样的login_path不能分享给所有系统用户,其他用户得重新添加自己的login_path才能正常使用。

(6) 使用Unix socket插件(推荐,仅限本地)

auth_socket插件只根据本地OS登录用户名和本地linux socket文件来授权认证。

例如修改用户ytt@localhost插件为auth_socket,

mysql> alter user ytt@localhost identified with auth_socket ;
Query OK, 0 rows affected (0.00 sec)mysql> \q
Bye

切换到OS用户ytt,

root@ytt-pc-big:/home/ytt# su yttytt@ytt-pc-big:~$ mysql -e "select user(),current_user()"
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| ytt@localhost | ytt@localhost  |
+---------------+----------------+
需要提醒一句:为了安全,操作MySQL的用户权限一定要做到按需分配。

小白学习MySQL

《小白学习MySQL - 增量统计SQL的需求 - 开窗函数的方案》

《小白学习MySQL - 统计的"投机取巧"》

《小白学习MySQL - 增量统计SQL的需求》

《小白学习MySQL - 你碰到过这种无法登陆的场景?》

《小白学习MySQL - 不同版本创建用户的些许区别》

《小白学习MySQL - 随机插入测试数据的工具》

《小白学习MySQL - varchar类型字段为什么经常定义成255?》

《小白学习MySQL - 变通创建索引的案例一则》

《小白学习MySQL - “投机取巧”统计表的记录数》

《小白学习MySQL - 一次慢SQL的定位》

《小白学习MySQL - TIMESTAMP类型字段非空和默认值属性的影响》

《小白学习MySQL - 聊聊数据备份的重要性》

《小白学习MySQL - InnoDB支持optimize table?》

《小白学习MySQL - table_open_cache的作用》

《小白学习MySQL - 表空间碎片整理方法》

《小白学习MySQL - 大小写敏感问题解惑》

《小白学习MySQL - only_full_group_by的校验规则》

《小白学习MySQL - max_allowed_packet》

《小白学习MySQL - mysqldump保证数据一致性的参数差异》

《小白学习MySQL - 查询会锁表?》

《小白学习MySQL - 索引键长度限制的问题》

《小白学习MySQL - MySQL会不会受到“高水位”的影响?》

《小白学习MySQL - 数据库软件和初始化安装》

《小白学习MySQL - 闲聊聊》

近期更新的文章:

《国产数据库名录一览》

《小白学习MySQL - 统计的"投机取巧"》

《小白学习MySQL - 增量统计SQL的需求》

《腾讯会议号设计的几种猜测》

《充电宝的玄机》

近期的热文:

《"红警"游戏开源代码带给我们的震撼》

文章分类和索引:

《公众号1000篇文章分类和索引》

脚本中如何优雅避免MySQL登录提示信息相关推荐

  1. centos系统中mysql密码_CentOS系统找回mysql登录密码

    在使用CentOS系统中,也许你会对很多的东西进行设置密码,来保护你的电脑的安全问题等,那么,如过一个不小心把密码忘记了,也许会给你的工作带来很多的不便.下面我们就来帮大家解决一个关于CentOS系统 ...

  2. shell脚本mysql_Shell脚本中执行sql语句操作MySQL数据库的几个方法

    实验如下: [root@idb1 ~]# more /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m mysql> show va ...

  3. xshell下载mysql到本地文件_在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)-Go语言中文社区...

    在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...

  4. 【Linux】Shell脚本中如何使用“循环”遍历“数组”中的元素(包括MySQL的常用指令介绍)

    一.背景 实习过程中,今天mentor突然让我拉取一下远端园区数据库中的部分信息,因为包含很多不同园区的数据信息,而且要以园区为单位生成文件来对数据进行存放,因此自然是需要使用shell脚本来自动生成 ...

  5. 多宽带联网(三) OpenWrt中使用cURL方法编写Shell脚本自动完成网页宽带认证登录(校园网认证登录解决方案) 使用awk命令

    对于非PPPoE方式认证,而是采用网页认证登录的宽带用户(如校园网).采用<多宽带联网(二)>中的方法一个一个接口进行认证登录过于繁琐.本节将采用Shell脚本和cURL方法,模拟人工认证 ...

  6. expect脚本中使用普通用户执行sh脚本命令,expect脚本中解决``反引号获取值有问题方法、expect遍历登录不同主机不同密码的主机执行指定命令方法

    文章目录 说明 代码 脚本内容 存放ip和其密码 执行脚本 测试[必做] 批量跑脚本 后台验证 说明 今天有一个脚本需求[目前有400台虚拟机,手动登录肯定不现实的],5期所有虚拟机都需要验证是否已经 ...

  7. php调用mysql查询结果_php - 在php脚本中处理select查询结果集

    在php脚本中执行select查询命令,也是调用mysql_query()函数,但是和执行DML不同的是,执行SELECT 命令后,mysql_query()函数的返回值是一个资源的引用指针(结果集) ...

  8. MySQL登录时ERROR 1045:Access denied for user ‘root’@’localhost’ (using password: YES)

    MySQL登录时ERROR 1045错误 win10_x64系统中登录MySQL时出现1045错误 错误描述: ERROR 1045:Access denied for user 'root'@'lo ...

  9. centos 多个mysql,Centos中安装多个MySQL数据的配置实例

    这篇文章主要为大家详细介绍了Centos中安装多个MySQL数据的配置实例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧! 注:本文档做了两个MYS ...

最新文章

  1. java永生代和新生代_Java:永生的对象和对象的复活
  2. Mongodb Replica Configure
  3. 洛谷 3381 【模板】最小费用最大流
  4. 【Java】Springboot项目中Transactional的使用方式
  5. 计算机控制系统笔记,计算机控制系统复习笔记.doc
  6. 安装TinyOS需要六个步骤
  7. 2017百度之星初赛:A-1001. 小C的倍数问题
  8. mysql 命令 kill_当MySQL事务中发生了网络异常
  9. linux vi 底行命令,Linux下vi命令详解
  10. springboot+安卓app电子阅览室系统毕业设计源码016514
  11. NCM格式如何转换为Mp3-音乐格式ncm转换mp3工具
  12. 在巨人的肩上:开源GIS工程大全索引
  13. linux 脚本加密 shc
  14. Javaweb分页技术实现
  15. html中关于侧边导航栏和导航栏的编写
  16. Matlab自带排序函数sort用法
  17. 算法第四版扔鸡蛋问题
  18. 不要在极端情绪下处理感情,好吗?
  19. 《大话西游》你真的看懂了吗,kotlin命令行编译
  20. 【求职】陌陌C++方向面经

热门文章

  1. python数据科学手册pdf中文版百度云_书籍推荐:《Python数据科学手册》(高清官方中文版PDF)...
  2. 突击蓝桥杯嵌入式(十二)——第十二届省赛第一场真题 停车场
  3. 黄州快哉亭记(苏辙)最后一句
  4. java pcm转adpcm_音频编码:ADPCM
  5. 重磅!9个中文免费电子书网站合集来了
  6. 哈工大 c语言测控系统 输入一个数x,其小于10^100,哈工大C语言试题.doc
  7. kindeditor使用。
  8. PHP的HTTP客户端:Guzzle的简单使用
  9. vue系列:Vue核心概念及特性 (一)
  10. win10更新双系统启动选项消失得解决方案