MySQL 編寫腳本時如何避免煩人的警告
有客戶在編寫前期數據庫安全規范時,就如何更安全的在 Linux Shell 端操作 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 ytt
ytt@ytt-pc-big:~$ mysql -e "select user(),current_user()"
+---------------+----------------+
| user() | current_user() |
+---------------+----------------+
| ytt@localhost | ytt@localhost |
+---------------+----------------+
這里需要提醒一句:為了安全,操作 MySQL 的用戶權限一定要做到按需分配。