脚本中如何优雅避免MySQL登录提示信息
无论是开发,还是运维,可能我们都写过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登录提示信息相关推荐
- centos系统中mysql密码_CentOS系统找回mysql登录密码
在使用CentOS系统中,也许你会对很多的东西进行设置密码,来保护你的电脑的安全问题等,那么,如过一个不小心把密码忘记了,也许会给你的工作带来很多的不便.下面我们就来帮大家解决一个关于CentOS系统 ...
- shell脚本mysql_Shell脚本中执行sql语句操作MySQL数据库的几个方法
实验如下: [root@idb1 ~]# more /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m mysql> show va ...
- xshell下载mysql到本地文件_在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)-Go语言中文社区...
在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...
- 【Linux】Shell脚本中如何使用“循环”遍历“数组”中的元素(包括MySQL的常用指令介绍)
一.背景 实习过程中,今天mentor突然让我拉取一下远端园区数据库中的部分信息,因为包含很多不同园区的数据信息,而且要以园区为单位生成文件来对数据进行存放,因此自然是需要使用shell脚本来自动生成 ...
- 多宽带联网(三) OpenWrt中使用cURL方法编写Shell脚本自动完成网页宽带认证登录(校园网认证登录解决方案) 使用awk命令
对于非PPPoE方式认证,而是采用网页认证登录的宽带用户(如校园网).采用<多宽带联网(二)>中的方法一个一个接口进行认证登录过于繁琐.本节将采用Shell脚本和cURL方法,模拟人工认证 ...
- expect脚本中使用普通用户执行sh脚本命令,expect脚本中解决``反引号获取值有问题方法、expect遍历登录不同主机不同密码的主机执行指定命令方法
文章目录 说明 代码 脚本内容 存放ip和其密码 执行脚本 测试[必做] 批量跑脚本 后台验证 说明 今天有一个脚本需求[目前有400台虚拟机,手动登录肯定不现实的],5期所有虚拟机都需要验证是否已经 ...
- php调用mysql查询结果_php - 在php脚本中处理select查询结果集
在php脚本中执行select查询命令,也是调用mysql_query()函数,但是和执行DML不同的是,执行SELECT 命令后,mysql_query()函数的返回值是一个资源的引用指针(结果集) ...
- 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 ...
- centos 多个mysql,Centos中安装多个MySQL数据的配置实例
这篇文章主要为大家详细介绍了Centos中安装多个MySQL数据的配置实例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧! 注:本文档做了两个MYS ...
最新文章
- java永生代和新生代_Java:永生的对象和对象的复活
- Mongodb Replica Configure
- 洛谷 3381 【模板】最小费用最大流
- 【Java】Springboot项目中Transactional的使用方式
- 计算机控制系统笔记,计算机控制系统复习笔记.doc
- 安装TinyOS需要六个步骤
- 2017百度之星初赛:A-1001. 小C的倍数问题
- mysql 命令 kill_当MySQL事务中发生了网络异常
- linux vi 底行命令,Linux下vi命令详解
- springboot+安卓app电子阅览室系统毕业设计源码016514
- NCM格式如何转换为Mp3-音乐格式ncm转换mp3工具
- 在巨人的肩上:开源GIS工程大全索引
- linux 脚本加密 shc
- Javaweb分页技术实现
- html中关于侧边导航栏和导航栏的编写
- Matlab自带排序函数sort用法
- 算法第四版扔鸡蛋问题
- 不要在极端情绪下处理感情,好吗?
- 《大话西游》你真的看懂了吗,kotlin命令行编译
- 【求职】陌陌C++方向面经
热门文章
- python数据科学手册pdf中文版百度云_书籍推荐:《Python数据科学手册》(高清官方中文版PDF)...
- 突击蓝桥杯嵌入式(十二)——第十二届省赛第一场真题 停车场
- 黄州快哉亭记(苏辙)最后一句
- java pcm转adpcm_音频编码:ADPCM
- 重磅!9个中文免费电子书网站合集来了
- 哈工大 c语言测控系统 输入一个数x,其小于10^100,哈工大C语言试题.doc
- kindeditor使用。
- PHP的HTTP客户端:Guzzle的简单使用
- vue系列:Vue核心概念及特性 (一)
- win10更新双系统启动选项消失得解决方案