01.21 Mysql Shell免密登錄的思考及實際應用案例

前言

數據庫圖形化工具的出現,給我們操作數據庫帶來了許多便利,但是過度的依賴工具,始終無法明白其內部 的一些原理,離開了工具,可能寸步難行,所以儘量使用原生的命令行來操作數據庫,可以增加熟練度,提高我們知識的深度。


最常見的明文登錄方式

以下mysql命令參數,相信大家已經是耳熟能詳了:

<code>-h參數指定mysql主機。

-u指定mysql用戶。

-P(大寫)指定端口。

-p(小寫)指定密碼。
/<code>

這裡衍生出兩個問題:

1)每次使用都需要指定一長串的參數和密碼。

2)密碼直接在命令行暴露出來,運行時,在一個短暫的時間間隔內,是可以直接通過ps命令查看到你數據庫的密碼的,所以十分不安全。

當然你可以不用指定密碼參數,而是選擇手動輸入。

Mysql Shell免密登錄的思考及實際應用案例


明文配置文件的方式登錄

如果你不想在控制檯,以交互的方式輸入密碼,那還有一種方式,將明文密碼寫入到文件中。

Mysql Shell免密登錄的思考及實際應用案例

當然也可以試試驗證讀取配置情況:

<code>mysql --defaults-file=./A.cnf --print-defaults/<code>
Mysql Shell免密登錄的思考及實際應用案例

這裡打印的意思是:mysql將會使用如下的參數進行登錄連接。


小結

總結來說:指定明文密碼的兩種方式是:

1)通過指定--password (-p) 交互式的輸入密碼。

2)將密碼放在一個配置 文件中。

當我們使用一些數據庫的shell腳本時,當然不能這樣交互式的輸入密碼,並且我們也不想把密碼暴露到配置文件中,那該怎麼做呢?


學習mysql命令的參數配置項

不知道如何實現,我們首先來熟悉熟悉mysql命令提供的參數。默認情況下,mysql會按如下順序讀取配置:

1) /etc/my.cnf

2)/etc/mysql/my.cnf

3)~/.my.cnf

參數:

  • --no-defaults ,不讀取配置文件中的任何內容。但是mylogin.cnf除外。
  • --login-path,指定在mysqlconfigeditor中設置選項組名稱。
  • --print-defaults,打印從參數配置文件中獲得的所有選項。密碼值會被屏蔽。

瞭解了上述的基本參數作用後,我們來學習,如何保護我們的密碼。


使用mysqlconfigeditor存儲登錄信息

mysqlconfigeditor是一個存儲mysql登錄信息的工具,它會將你的身份認證信息存儲到一個名為 .mylogin.cnf 的登錄路徑文件中。

由於該文件是隱藏文件,你可以用如下命令查看:

<code>ls -l .mylogin.cnf /<code>

文件的內容是進行了混淆加密的,明文方式它存儲的文件內容大概是:

<code>[pathA]
user = aaa
password = aaapwd
host = ip1

[pathB]
user = root
password = pwd2
host = ip2/<code>

這裡,可以有多組配置,每一個用括號包裹的塊,我們稱它為選項組,每個選項組內容包括:主機、用戶、密碼、端口、套接字等信息。

當調用Mysql客戶端命令連接到服務器時,客戶端將mylogin.cnf與其他指定的參數配置文件一起使用。這裡的優先級高於其他文件,但低於在客戶端命令行上顯式指定的配置。

Mysql Shell免密登錄的思考及實際應用案例

當然啦,我們也可以顯示的指定用那個選項組,就像是使用A計劃還是B計劃一樣。默認mysql會執行[client] 和 [mysql] 選項組配置。


將密碼放入受保護的文件

要查看mysqlconfigeditor寫入.mylogin.cnf文件的內容,我們可以使用如下命令:

<code>mysql_config_editor print --all

mysql_config_editor print --login-path=pathA

/<code>

登錄路徑文件必須對當前用戶是可讀和可寫的,而對其他用戶是不可訪問的。否則,mysqlconfigeditor將忽略它,客戶機程序也不會使用它,一個完整的設置命令入下:

<code>mysql_config_editor set --login-path=pathA  \\
--host=localhost --user=root --password --port=3306 \\
--socket=~/pathA_mysql.sock
/<code>


操作幫助說明可以通過執行如下命令查看:

<code>mysql_config_editor set --help/<code>

其中--socket指定mysql以socket方式運行的sock文件位置。--password 指定需要密碼,這裡會在回車後讓你輸入密文。它默認在數據存儲到內容中,並且,我們使用print打印的時候,它同樣也不會顯示明文,是不是安全多了呢。

Mysql Shell免密登錄的思考及實際應用案例

登錄命令變成:

<code>mysql --login-path=pathA/<code>


實際案例應用

完成上述配置後,我們可以愉快的使用密文登錄mysql啦。這裡提供一個實際的案例。

要求:編寫crontab定時任務,定時的清理mysql A表一天前的數據,每天早上6點執行,需要提供日誌記錄顯示執行狀態。


小試牛刀

上面我們已經配置好了免密登錄,下面來試試執行一條sql語句。

<code>mysql --login-path=pathA -e 'select 1'/<code>
Mysql Shell免密登錄的思考及實際應用案例

獲取今天凌晨的毫秒值:

<code>select UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE)) * 1000/<code>

沒有任何問題,按照要求,我們編寫帶記錄日誌的shell腳本,參考如下:

<code>#!/bin/sh
# adirname - return 絕對路徑
adirname() { odir=`pwd`; cd `dirname $1`; pwd; cd "${odir}"; }
MYNAM=`basename "$0"`
MYDIR=`adirname "$0"`
MYHOME="/home/appuser"
MYLOG_PATH="${MYHOME}/logs"
MYLOG="${MYLOG_PATH}/${MYNAM}_`date +%F`.log"

if [ ! -f "$MYLOG" ]; then
touch "$MYLOG"
fi

# 記錄日誌
function loginfo(){
echo "$1"
echo "$(date -d today +"%Y%m%d %H:%M:%S") - $1" >> ${MYLOG} 2>> ${MYLOG}
}

mysql --login-path=pathA -e 'delete from A where time < UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE)) * 1000'

loginfo "handle delete table successfully,$?"/<code>

加入crontab定時任務

<code>#每天6點執行
0 6 * * * /bin/sh /home/root/del_tabl_task.sh/<code>


總結

本文對比介紹了 明文密碼登錄mysql的兩種方式和密文登錄。希望你瞭解如下知識點:1、mysqlconfigeditor工具的用法及作用?

2、mysql shell腳本的簡單使用?

3、crontab定時任務腳本的配置使用。

4、如何在shell中記錄輸出日誌到文件。

當然這些知識可能都只是冰山一角,希望對你有所啟發。

為了方便大家學習討論,我創建了一個java疑難攻堅互助大家庭,和其他傳統的學習交流不同。本群主要致力於解決項目中的疑難問題,在遇到項目難以解決的問題時,都可以在這個大家庭裡尋求幫助。

公眾關號注俠夢的開發筆記後回覆【問題的答案】進入:java中Integer包裝類的基本數據類型是?如果你也經歷過遇到項目難題,無從下手,他人有可能可以給你提供一些思路和看法,一百個人就有一百種思路,同樣,如果你也樂於幫助別人,那解決別人遇到的問題,也同樣對你是一種鍛鍊。


自學路上你不孤單,歡迎來公眾號【俠夢的開發筆記】,回覆乾貨,為你準備了精選的學習視頻


分享到:


相關文章: