当前位置: 首页 > 科技观察

写MySQL脚本时如何避免恼人的警告

时间:2023-03-13 04:44:02 科技观察

一位前期在写数据库安全规范的客户,找我们帮忙出一份详细的文档,如何在LinuxShell端更安全的操作MySQL。内容之一是如何屏蔽在LinuxShell下调用MySQL各种命令行工具时烦人的告警信息输出,例如:root@ytt-ubuntu18:/home/ytt#mysql-uytt-proot-e"selectversion()"mysql:[警告]在命令行界面上使用密码可能不安全。+------------+|版本()|+-------------+|8.0.29|+------------+其实这是个很老的问题了!随便百度一下,有各种解决办法,但是都写的不是很好。这样的警告信息对于命令执行结果的输出是非常不友好的,那么如何屏蔽呢?下面我会列出几种我能想到的方法供参考。1.给用户一个空密码(不推荐)。给用户空密码虽然可以屏蔽警告信息,但是极不安全,类似于MySQL服务初始化时的--initialize-insecure选项。root@ytt-ubuntu18:/home/ytt#mysql-uytt_no_pass-e"selectuser()"+------------------------+|用户()|+----------------------+|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=yttpassword=rootport=3340[mysqldump]user=yttpassword=rootport=3340[mysqladmin]user=yttpassword=rootport=3340以上,[mysql]块下的内容表示对mysql命令行生效,[mysqldump]块下的内容表示对mysql命令行生效mysqldump工具,[mysqladmin]块下的内容表示对mysqladmin工具有效。或者写的简单点,加到[client],也就是对所有client生效。请注意,此处只能添加部分共享内容。root@ytt-ubuntu18:/home/ytt#cat/etc/mysql/conf.d/mysql.cnf[mysql]prompt=mysql:\d:\v>[client]user=yttpassword=rootport=3340由于这些blocks都是为客户端设置的,无需重启MySQL服务,立即生效。root@ytt-ubuntu18:/home/ytt#mysql-e"selectuser()"+----------------+|用户()|+--------------+|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#exportMYSQL_PWD=rootMYSQL_TCP_PORT=3340root@ytt-ubuntu18:/home/ytt#mysql-uytt-e"selectuser()"+--------------+|用户()|+----------------+|ytt@localhost|+----------------+同样不推荐这种方式,环境变量MYSQL_PWD容易被其他用户获取。比如MYSQL_PWD的值,直接使用ps命令就可以轻松获取。用户1执行以下命令:root@ytt-ubuntu18:/home/ytt#mysql-uytt-e"selectsleep(1000)"用户2执行psaex打印出环境变量MYSQL_PWD和MYSQL_TCP_PORT的值:root@ytt-ubuntu18:/home/ytt#psaex|grepMYSQL_PWD|grep-v'grep'7592pts/0S+0:00mysql-uytt-eselectsleep(1000)LS_COLORS=rs=0:...MYSQL_PWD=root。..MYSQL_TCP_PORT=3340...4。屏蔽标准错误输出并重定向到空设备文件(推荐)root@ytt-ubuntu18:/home/ytt#mysql-uytt-proot-P3340-e"selectversion()"2>/dev/null+-----------+|版本()|+------------+|8.0.29|+------------+这里利用Linux系统的特性对MySQL错误信息进行重定向,其中数字2表示错误输出的文件描述符;/dev/null代表空设备。也就是说,将执行这条命令的错误信息重定向到空设备,而不是标准输出,这样就可以变相屏蔽警告信息。5、使用mysql_config_edit工具生成不同的login_paths(推荐)mysql_config_edit是MySQL官方发布的一款工具,专门用来处理这类必须暴露用户密码的问题。它可以设置一次并安全地使用多次。使用方法如下:设置一个login_path,名称为user_ytt,根据提示输入密码即可。root@ytt-ubuntu18:/home/ytt#mysql_config_editorset-Guser_ytt-S/var/run/mysqld/mysqld.sock-uytt-pEnterpassword:接下来只需要带--login-path选项即可可以使用。root@ytt-ubuntu18:/home/ytt#mysql--login-path=user_ytt-e'selectuser()'+----------------+|用户()|+--------------+|ytt@localhost|+----------------+root@ytt-ubuntu18:/home/ytt#mysqladmin--login-path=user_yttpingmysqldisalivemysql_config_editor工具也有缺点:同一个login_path不能共享给所有系统用户,其他用户必须重新添加自己的login_path才能正常使用。6、使用Unixsocket插件(推荐,localonly)auth_socket插件只根据本地OS登录用户名和本地linuxsocket文件授权认证。例如修改用户ytt@localhost的插件为auth_socket:mysql>alteruserytt@localhostidentifiedwithauth_socket;QueryOK,0rowsaffected(0.00sec)mysql>\qByeswitchtoOSuserytt:root@ytt-pc-big:/home/ytt#suyttytt@ytt-pc-big:~$mysql-e"selectuser(),current_user()"+---------------+-----------------+|用户()|当前用户()|+----------------+-----------------+|ytt@localhost|ytt@localhost|+----------------+----------------+这里需要提醒:为了安全,用户权限为操作MySQL必须按需分配。