文章目錄
- 一、MySQL 8 自動安裝腳本腳本說明
- 📌 使用腳本前提條件
- 1. 操作系統
- 2. 用戶權限
- 3. 網絡要求
- 📌 腳本的主要功能
- 1. 環境檢查
- 2. MySQL 自動安裝
- 3. 自動配置 MySQL
- 4. 防火墻配置
- 5. 驗證與輸出
- 📌 適用場景
- 二、執行sh腳本
- 1. 給予腳本執行權限
- 2. 腳本內容
- 三、腳本執行結果
- 1. 登錄 mysql 測試
- 2. 遠程 mysql 測試
一、MySQL 8 自動安裝腳本腳本說明
這個腳本是一個用于在 CentOS 7 系統上安裝和配置 MySQL 的自動化腳本
備注:
該腳本只適用于 CentOS-7 系統
,確保 CentOS-7系統 是聯網狀態,否則腳本執行時會出現下載錯誤的情況
腳本執行完之后,root
用戶密碼是 123456
,同時會新建一個任意主機登錄且擁有所有權限的 test
用戶,密碼同樣是 123456
(用于測試練習環境,密碼可自行修改)。
📌 使用腳本前提條件
1. 操作系統
? 僅支持 CentOS 7(其他版本如 CentOS 8、RHEL、Ubuntu 等不兼容)
? 必須是純凈的 CentOS 7 或新裝系統(避免軟件沖突)
2. 用戶權限
? 必須使用 root 用戶執行(或具有 sudo -i
權限的用戶)
? 普通用戶無權限安裝 MySQL 和修改系統配置
3. 網絡要求
? 服務器必須能訪問互聯網(自動下載 MySQL Yum 倉庫和依賴包)
📌 腳本的主要功能
1. 環境檢查
- 檢查是否為 root 用戶(必須 root 權限運行)
- 檢查操作系統是否為 CentOS 7(僅支持 CentOS 7)
- 檢查 MySQL 是否已安裝(避免重復安裝)
2. MySQL 自動安裝
- 配置 MySQL Yum 倉庫(自動下載官方 repo)
- 導入 GPG 密鑰(確保軟件包來源可信)
- 安裝 MySQL 服務器(默認安裝最新穩定版)
- 啟動 MySQL 服務(并設置開機自啟)
3. 自動配置 MySQL
- 獲取臨時密碼(MySQL 8.0+ 默認生成臨時密碼)
- 修改 root 密碼為
123456
(簡化測試環境登錄) - 調整密碼策略(臨時降低復雜度要求,便于測試)
- 創建測試用戶
test
(密碼123456
,開放遠程訪問權限)
4. 防火墻配置
- 開放 3306 端口(允許遠程連接 MySQL)
5. 驗證與輸出
- 檢查 MySQL 是否正常運行
- 顯示 MySQL 版本信息
- 匯總所有操作記錄(成功/跳過的步驟)
- 輸出連接信息(root/test 用戶及密碼)
📌 適用場景
? 測試環境快速搭建(開發、學習、實驗)
? 自動化部署 MySQL(避免手動安裝的繁瑣步驟)
? 批量配置 MySQL 服務器(適用于多臺 CentOS 7 服務器)
? MySQL 學習者的練習環境(默認密碼簡化操作)
二、執行sh腳本
建議先使用 vi/vim
編輯命令創建并編輯一個名為 install_mysql.sh
的腳本文件(名字可以自定義,寫 1.sh
都可以),然后把下面的腳本內容復制粘貼過去即可
- 在 Linux 系統中,要讓一個 shell 腳本可以執行,就需要給它添加執行權限。
chmod +x
- 命令能為文件添加可執行權限之后再給腳本執行權限。腳本文件后綴
- 雖然 Linux 系統本身并不依靠文件后綴來識別文件類型,但使用
.sh
作為 shell腳本的后綴,能增強腳本的可讀性與可維護性,同時也有助于系統識別腳本類型。
備注: 如果在Windows上面拖文件進去的話,有可能會出現編碼格式問題導致運行腳本出現其他錯誤問題,只是有這個可能。
1. 給予腳本執行權限
這里是把腳本內容,在 vim
的 INSERT
(插入)模式下復制粘貼到新建的 文件名.sh
里面,然后保存退出,使用chmod +x 文件名.sh
給予執行權限,最后再使用 ./文件名.sh
執行腳本。
vim install_mysql.sh # 編輯 .sh 文件(文件名可自定義)
chmod +x install_mysql.sh # 給予 .sh 文件可執行文件(不授權無法執行.sh文件)
./install_mysql.sh # ./ 執行 .sh 文件
2. 腳本內容
這里復制粘貼過去
vim
編輯的文件里面 (最好是在vim的插入模式下粘貼過去)
#!/bin/bash# 定義顏色代碼
RED='\033[0;31m' # 錯誤信息
GREEN='\033[0;32m' # 成功信息
YELLOW='\033[0;33m' # 警告/提示信息
BLUE='\033[0;34m' # 步驟信息
PURPLE='\033[0;35m' # 強調信息
CYAN='\033[0;36m' # 執行命令/詳細信息
NC='\033[0m' # 恢復默認顏色# 初始化操作記錄數組
declare -a operations_done
declare -a operations_skipped# 顯示腳本標題
echo -e "${PURPLE}"
echo "╔══════════════════════════════════════════════════╗"
echo "║ MySQL一鍵安裝配置腳本(CentOS 7測試環境) ║"
echo "╚══════════════════════════════════════════════════╝"
echo -e "${NC}"# 記錄腳本開始時間
start_time=$(date +%s)# 1. 檢查運行環境
echo -e "${BLUE}? 1. 正在檢查運行環境...${NC}"# 檢查是否為root用戶
echo -e "${CYAN}[執行] id -u${NC}"
if [ "$(id -u)" -ne 0 ]; thenecho -e "${RED}? 錯誤:此腳本必須以root用戶身份運行!${NC}"echo -e "${YELLOW}請使用命令:sudo -i 切換到root用戶后再執行本腳本${NC}"exit 1
elseoperations_done+=("檢查root用戶權限")echo -e "${GREEN}? 當前用戶是root${NC}"
fi# 檢查系統是否為CentOS 7
echo -e "${CYAN}[執行] grep -q \"CentOS Linux release 7\" /etc/centos-release${NC}"
if ! grep -q "CentOS Linux release 7" /etc/centos-release 2>/dev/null; thenecho -e "${RED}? 錯誤:此腳本僅適用于CentOS 7系統!${NC}"echo -e "${YELLOW}檢測到您的系統不是CentOS 7,請更換系統后再試${NC}"exit 1
elseoperations_done+=("檢查系統版本為CentOS 7")echo -e "${GREEN}? 系統版本檢查通過${NC}"
fiecho -e "${GREEN}? 環境檢查全部通過${NC}"# 2. 檢查MySQL是否已安裝
echo -e "${BLUE}? 2. 正在檢查MySQL安裝狀態...${NC}"
echo -e "${CYAN}[執行] rpm -qa | grep -q mysql-community-server${NC}"if rpm -qa | grep -q mysql-community-server; thenoperations_done+=("檢測到MySQL已安裝")echo -e "${YELLOW}? 檢測到MySQL已安裝,將檢查root密碼...${NC}"# 先檢查密碼是否為123456echo -e "${CYAN}[執行] mysql -uroot -p'123456' -e \"SELECT 1\"${NC}"if mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; thenoperations_skipped+=("修改root密碼(已經是123456)")echo -e "${GREEN}? 檢測到MySQL root密碼已經是123456,無需修改${NC}"elseecho -e "${YELLOW}? root密碼不是123456,將嘗試自動修改root密碼...${NC}"# 保存原密碼策略echo -e "${CYAN}[執行] 獲取當前密碼策略...${NC}"old_policy=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.policy';" 2>/dev/null | awk '{print $2}')[ -z "$old_policy" ] && old_policy="HIGH"old_length=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.length';" 2>/dev/null | awk '{print $2}')[ -z "$old_length" ] && old_length="8"old_mixed_case_count=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.mixed_case_count';" 2>/dev/null | awk '{print $2}')[ -z "$old_mixed_case_count" ] && old_mixed_case_count="1"old_number_count=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.number_count';" 2>/dev/null | awk '{print $2}')[ -z "$old_number_count" ] && old_number_count="1"old_special_char_count=$(mysql -uroot -p'123456' -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.special_char_count';" 2>/dev/null | awk '{print $2}')[ -z "$old_special_char_count" ] && old_special_char_count="1"# 增強的密碼修改函數function modify_existing_mysql() {echo -e "${CYAN}[執行] grep 'temporary password' /var/log/mysqld.log${NC}"local temp_password=$(grep 'temporary password' /var/log/mysqld.log 2>/dev/null | awk '{print $NF}')local methods=("臨時密碼:${temp_password}""空密碼""已知密碼:123456")for method in "${methods[@]}"; doIFS=':' read -r method_type method_pass <<< "$method"echo -e "${CYAN}嘗試方法: ${method_type}...${NC}"local mysql_cmd="mysql -uroot"[ -n "$method_pass" ] && mysql_cmd+=" -p'${method_pass}'"echo -e "${CYAN}[執行] ${mysql_cmd} --connect-expired-password <修改密碼SQL${NC}"${mysql_cmd} --connect-expired-password <<EOF 2>/dev/null
ALTER USER 'root'@'localhost' IDENTIFIED BY 'TempPass@123';
SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=6;
SET GLOBAL validate_password.mixed_case_count=0;
SET GLOBAL validate_password.number_count=0;
SET GLOBAL validate_password.special_char_count=0;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
EOFif [ $? -eq 0 ]; thenoperations_done+=("使用${method_type}修改root密碼")return 0fidone# 如果常規方法都失敗,嘗試強制修改echo -e "${RED}? 所有常規方法失敗,嘗試強制修改密碼...${NC}"echo -e "${CYAN}[執行] systemctl stop mysqld${NC}"systemctl stop mysqld || return 1echo -e "${CYAN}[執行] mysqld_safe --skip-grant-tables --skip-networking &${NC}"mysqld_safe --skip-grant-tables --skip-networking &sleep 5echo -e "${CYAN}[執行] mysql -uroot <強制修改密碼SQL${NC}"mysql -uroot <<EOF
UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE User='root';
FLUSH PRIVILEGES;
EOFecho -e "${CYAN}[執行] pkill mysqld${NC}"pkill mysqldsleep 2echo -e "${CYAN}[執行] systemctl start mysqld${NC}"systemctl start mysqldif mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; thenoperations_done+=("強制修改root密碼")return 0elsereturn 1fi}if modify_existing_mysql; then# 恢復原密碼策略echo -e "${CYAN}[執行] 恢復原密碼策略...${NC}"mysql -uroot -p'123456' -e "SET GLOBAL validate_password.policy='$old_policy'; SET GLOBAL validate_password.length='$old_length'; SET GLOBAL validate_password.mixed_case_count='$old_mixed_case_count'; SET GLOBAL validate_password.number_count='$old_number_count'; SET GLOBAL validate_password.special_char_count='$old_special_char_count'; FLUSH PRIVILEGES;" >/dev/null 2>&1 && \operations_done+=("恢復原密碼策略")elseecho -e "${RED}? 自動修改密碼失敗!${NC}"echo -e "${YELLOW}請嘗試以下手動解決方案:${NC}"echo -e "1. 停止MySQL服務: ${CYAN}systemctl stop mysqld${NC}"echo -e "2. 啟動安全模式: ${CYAN}mysqld_safe --skip-grant-tables &${NC}"echo -e "3. 無密碼登錄: ${CYAN}mysql -uroot${NC}"echo -e "4. 執行SQL: ${CYAN}UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE User='root';${NC}"echo -e "5. 刷新權限: ${CYAN}FLUSH PRIVILEGES;${NC}"echo -e "6. 退出并重啟MySQL服務"exit 1fifi# 檢查并創建test用戶echo -e "${CYAN}[執行] mysql -uroot -p'123456' -N -e \"SELECT 1 FROM mysql.user WHERE user = 'test' AND host = '%';\"${NC}"if [ -z "$(mysql -uroot -p'123456' -N -e "SELECT 1 FROM mysql.user WHERE user = 'test' AND host = '%';" 2>/dev/null)" ]; thenecho -e "${CYAN}[執行] 創建test用戶...${NC}"mysql -uroot -p'123456' -e "CREATE USER 'test'@'%' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" >/dev/null 2>&1 && \operations_done+=("創建test用戶(密碼123456,所有權限)")elseoperations_skipped+=("創建test用戶(已存在)")echo -e "${YELLOW}? test用戶已存在,跳過創建${NC}"fi# 計算并顯示腳本執行時間end_time=$(date +%s)duration=$((end_time - start_time))# 顯示操作匯總echo -e "\n${BLUE}════════════════════ 操作匯總 ════════════════════${NC}"echo -e "${GREEN}? 已完成的操作:${NC}"printf " ? %s\n" "${operations_done[@]}"if [ ${#operations_skipped[@]} -gt 0 ]; thenecho -e "${YELLOW}? 已跳過的操作:${NC}"printf " ? %s\n" "${operations_skipped[@]}"fiecho -e "\n${BLUE}? 腳本執行完成,總耗時: ${PURPLE}${duration}秒${NC}"# 顯示最終用戶信息echo -e "\n${PURPLE}════════════════════ 連接信息 ════════════════════${NC}"echo -e "| ${CYAN}MySQL root用戶: ${PURPLE}root${NC} 密碼: ${PURPLE}123456${NC}"echo -e "| ${CYAN}MySQL test用戶: ${PURPLE}test${NC} 密碼: ${PURPLE}123456 (可從任意主機連接)${NC}"echo -e "${PURPLE}══════════════════════════════════════════════════${NC}"exit 0
fi# 以下是新安裝MySQL的流程 --------------------------------------------------operations_done+=("檢測到MySQL未安裝,開始全新安裝流程")
echo -e "${GREEN}? 檢測到MySQL未安裝,將開始全新安裝流程${NC}"# 3. 配置MySQL Yum倉庫
echo -e "${BLUE}? 3. 正在配置MySQL Yum倉庫...${NC}"if ! rpm -qa | grep -q mysql80-community-release-el7; thenecho -e "${CYAN}[執行] 下載MySQL Yum倉庫...${NC}"echo -e "${CYAN}[執行] wget -O /tmp/mysql80-community-release-el7-7.noarch.rpm https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm${NC}"if wget -O /tmp/mysql80-community-release-el7-7.noarch.rpm https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm; thenecho -e "${CYAN}[執行] yum localinstall -y /tmp/mysql80-community-release-el7-7.noarch.rpm${NC}"if yum localinstall -y /tmp/mysql80-community-release-el7-7.noarch.rpm; thenrm -f /tmp/mysql80-community-release-el7-7.noarch.rpmoperations_done+=("安裝MySQL Yum倉庫")echo -e "${GREEN}? MySQL Yum倉庫安裝成功${NC}"elseecho -e "${RED}? 安裝MySQL Yum倉庫失敗!${NC}"exit 1fielseecho -e "${RED}? 下載MySQL Yum倉庫失敗!${NC}"exit 1fi
elseoperations_skipped+=("安裝MySQL Yum倉庫(已存在)")echo -e "${YELLOW}? MySQL Yum倉庫已安裝,跳過此步驟${NC}"
fi# 4. 導入GPG密鑰
echo -e "${BLUE}? 4. 正在導入GPG密鑰...${NC}"echo -e "${CYAN}[執行] rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022${NC}"
if rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 || rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql; thenoperations_done+=("導入MySQL GPG密鑰")echo -e "${GREEN}? GPG密鑰導入成功${NC}"
elseoperations_skipped+=("導入MySQL GPG密鑰")echo -e "${YELLOW}? 導入MySQL GPG密鑰失敗,將使用--nogpgcheck繼續${NC}"
fi# 5. 安裝MySQL服務器
echo -e "${BLUE}? 5. 正在安裝MySQL服務器...${NC}"echo -e "${CYAN}[執行] yum install -y mysql-community-server --nogpgcheck${NC}"
if yum install -y mysql-community-server --nogpgcheck; thenoperations_done+=("安裝MySQL服務器")echo -e "${GREEN}? MySQL服務器安裝成功${NC}"
elseecho -e "${RED}? MySQL服務器安裝失敗!嘗試清理后重新安裝...${NC}"echo -e "${CYAN}[執行] yum remove -y mysql-community-common mysql-community-libs${NC}"yum remove -y mysql-community-common mysql-community-libsecho -e "${CYAN}[執行] rm -rf /var/lib/mysql /etc/my.cnf*${NC}"rm -rf /var/lib/mysql /etc/my.cnf*echo -e "${CYAN}[執行] yum install -y mysql-community-server --nogpgcheck${NC}"if yum install -y mysql-community-server --nogpgcheck; thenoperations_done+=("安裝MySQL服務器(經過清理后)")echo -e "${GREEN}? MySQL服務器安裝成功(經過清理后)${NC}"elseecho -e "${RED}? MySQL服務器安裝仍然失敗!${NC}"exit 1fi
fi# 6. 啟動MySQL服務
echo -e "${BLUE}? 6. 正在啟動MySQL服務...${NC}"echo -e "${CYAN}[執行] systemctl start mysqld${NC}"
if systemctl start mysqld; thenoperations_done+=("啟動MySQL服務")echo -e "${CYAN}[執行] systemctl enable mysqld${NC}"systemctl enable mysqld && operations_done+=("設置MySQL開機自啟")echo -e "${GREEN}? MySQL服務啟動成功${NC}"
elseecho -e "${RED}? 啟動MySQL服務失敗!嘗試修復...${NC}"echo -e "${CYAN}[執行] chown -R mysql:mysql /var/lib/mysql${NC}"chown -R mysql:mysql /var/lib/mysqlecho -e "${CYAN}[執行] systemctl start mysqld${NC}"if systemctl start mysqld; thenoperations_done+=("啟動MySQL服務(經過修復后)")echo -e "${CYAN}[執行] systemctl enable mysqld${NC}"systemctl enable mysqld && operations_done+=("設置MySQL開機自啟")echo -e "${GREEN}? MySQL服務啟動成功(經過修復后)${NC}"elseecho -e "${RED}? 仍然無法啟動MySQL服務!${NC}"exit 1fi
fi# 7. 獲取臨時密碼
echo -e "${BLUE}? 7. 正在獲取臨時密碼...${NC}"echo -e "${CYAN}[執行] grep 'temporary password' /var/log/mysqld.log${NC}"
temp_password=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
if [ -z "$temp_password" ]; thenecho -e "${CYAN}[執行] 檢查是否已有密碼123456...${NC}"echo -e "${CYAN}[執行] mysql -uroot -p'123456' -e \"SELECT 1\"${NC}"if mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; thentemp_password="123456"operations_skipped+=("獲取臨時密碼(已有密碼123456)")echo -e "${YELLOW}? 檢測到已有密碼123456,使用此密碼${NC}"elseecho -e "${CYAN}[執行] 檢查是否可以空密碼登錄...${NC}"echo -e "${CYAN}[執行] mysql -uroot -e \"SELECT 1\"${NC}"if mysql -uroot -e "SELECT 1" >/dev/null 2>&1; thentemp_password=""operations_skipped+=("獲取臨時密碼(可以空密碼登錄)")echo -e "${YELLOW}? 可以空密碼登錄MySQL${NC}"elseecho -e "${RED}? 無法確定MySQL root密碼!${NC}"exit 1fifi
elseoperations_done+=("獲取臨時密碼")echo -e "${GREEN}? 獲取到臨時密碼: ${temp_password}${NC}"
fi# 8. 修改root密碼
echo -e "${BLUE}? 8. 正在修改root密碼...${NC}"# 保存原密碼策略
echo -e "${CYAN}[執行] 獲取當前密碼策略...${NC}"
old_policy=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.policy';" 2>/dev/null | awk '{print $2}')
[ -z "$old_policy" ] && old_policy="HIGH"
old_length=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.length';" 2>/dev/null | awk '{print $2}')
[ -z "$old_length" ] && old_length="8"
old_mixed_case_count=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.mixed_case_count';" 2>/dev/null | awk '{print $2}')
[ -z "$old_mixed_case_count" ] && old_mixed_case_count="1"
old_number_count=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.number_count';" 2>/dev/null | awk '{print $2}')
[ -z "$old_number_count" ] && old_number_count="1"
old_special_char_count=$(mysql -uroot -p"$temp_password" -N -e "SHOW GLOBAL VARIABLES LIKE 'validate_password.special_char_count';" 2>/dev/null | awk '{print $2}')
[ -z "$old_special_char_count" ] && old_special_char_count="1"function set_mysql_password() {local temp_pass="$1"local new_pass="123456"local mysql_cmd="mysql -uroot"[ -n "$temp_pass" ] && mysql_cmd+=" -p'${temp_pass}'"echo -e "${CYAN}[執行] ${mysql_cmd} --connect-expired-password <修改密碼SQL${NC}"mysql -uroot -p"$temp_pass" --connect-expired-password <<EOF 2>/dev/null
ALTER USER 'root'@'localhost' IDENTIFIED BY 'TempPass@123';
SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=6;
SET GLOBAL validate_password.mixed_case_count=0;
SET GLOBAL validate_password.number_count=0;
SET GLOBAL validate_password.special_char_count=0;
ALTER USER 'root'@'localhost' IDENTIFIED BY '${new_pass}';
FLUSH PRIVILEGES;
EOFreturn $?
}if set_mysql_password "$temp_password"; thenoperations_done+=("修改root密碼為123456")echo -e "${GREEN}? root密碼修改成功${NC}"
elseecho -e "${RED}? 常規密碼修改失敗!嘗試強制修改...${NC}"echo -e "${CYAN}[執行] systemctl stop mysqld${NC}"systemctl stop mysqldecho -e "${CYAN}[執行] mysqld_safe --skip-grant-tables --skip-networking &${NC}"mysqld_safe --skip-grant-tables --skip-networking &sleep 5echo -e "${CYAN}[執行] mysql -uroot <強制修改密碼SQL${NC}"mysql -uroot <<EOF
UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE User='root';
FLUSH PRIVILEGES;
EOFecho -e "${CYAN}[執行] pkill mysqld${NC}"pkill mysqldsleep 2echo -e "${CYAN}[執行] systemctl start mysqld${NC}"systemctl start mysqldif mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; thenoperations_done+=("強制修改root密碼為123456")echo -e "${GREEN}? 強制修改root密碼成功${NC}"elseecho -e "${RED}? 強制修改密碼失敗!${NC}"exit 1fi
fi# 恢復原密碼策略
echo -e "${CYAN}[執行] 恢復原密碼策略...${NC}"
mysql -uroot -p'123456' -e "SET GLOBAL validate_password.policy='$old_policy'; SET GLOBAL validate_password.length='$old_length'; SET GLOBAL validate_password.mixed_case_count='$old_mixed_case_count'; SET GLOBAL validate_password.number_count='$old_number_count'; SET GLOBAL validate_password.special_char_count='$old_special_char_count'; FLUSH PRIVILEGES;" >/dev/null 2>&1 && \
operations_done+=("恢復原密碼策略")
echo -e "${GREEN}? 密碼策略恢復成功${NC}"# 9. 配置防火墻
echo -e "${BLUE}? 9. 正在配置防火墻...${NC}"echo -e "${CYAN}[執行] systemctl is-active --quiet firewalld${NC}"
if systemctl is-active --quiet firewalld; thenecho -e "${CYAN}[執行] firewall-cmd --permanent --add-port=3306/tcp${NC}"if firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload; thenecho -e "${CYAN}[執行] firewall-cmd --list-ports | grep -q 3306${NC}"if firewall-cmd --list-ports | grep -q 3306; thenoperations_done+=("防火墻已放行3306端口")echo -e "${GREEN}? 防火墻3306端口配置成功${NC}"elseoperations_skipped+=("防火墻配置可能未生效,請手動檢查")echo -e "${YELLOW}? 防火墻配置可能未生效,請手動檢查${NC}"fielseoperations_skipped+=("防火墻配置失敗")echo -e "${YELLOW}? 防火墻配置失敗${NC}"fi
elseoperations_skipped+=("防火墻未運行,跳過端口配置")echo -e "${YELLOW}? 防火墻未運行,跳過端口配置${NC}"
fi# 10. 驗證安裝
echo -e "${BLUE}? 10. 正在驗證安裝結果...${NC}"echo -e "${CYAN}[執行] mysql -uroot -p'123456' -e \"SHOW DATABASES;\"${NC}"
if mysql -uroot -p'123456' -e "SHOW DATABASES;" >/dev/null 2>&1; thenoperations_done+=("驗證MySQL安裝成功")echo -e "${CYAN}[執行] mysql -uroot -p'123456' -e \"SELECT VERSION();\"${NC}"mysql_version=$(mysql -uroot -p'123456' -e "SELECT VERSION();" 2>/dev/null | tail -n 1)operations_done+=("MySQL版本: ${mysql_version}")echo -e "${GREEN}? MySQL安裝驗證成功,版本: ${mysql_version}${NC}"
elseecho -e "${RED}? 測試連接失敗!${NC}"exit 1
fi# 檢查并創建test用戶
echo -e "${CYAN}[執行] mysql -uroot -p'123456' -N -e \"SELECT 1 FROM mysql.user WHERE user = 'test' AND host = '%';\"${NC}"
if [ -z "$(mysql -uroot -p'123456' -N -e "SELECT 1 FROM mysql.user WHERE user = 'test' AND host = '%';" 2>/dev/null)" ]; thenecho -e "${CYAN}[執行] 創建test用戶...${NC}"mysql -uroot -p'123456' -e "CREATE USER 'test'@'%' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" >/dev/null 2>&1 && \operations_done+=("創建test用戶(密碼123456,所有權限)")echo -e "${GREEN}? test用戶創建成功${NC}"
elseoperations_skipped+=("創建test用戶(已存在)")echo -e "${YELLOW}? test用戶已存在,跳過創建${NC}"
fi# 11. 安全加固建議
operations_skipped+=("安全加固建議(測試環境可忽略)")
echo -e "${YELLOW}? 測試環境跳過安全加固建議${NC}"# 計算并顯示腳本執行時間
end_time=$(date +%s)
duration=$((end_time - start_time))# 顯示操作匯總
echo -e "\n${BLUE}════════════════════ 操作匯總 ════════════════════${NC}"
echo -e "${GREEN}? 已完成的操作:${NC}"
printf " ? %s\n" "${operations_done[@]}"if [ ${#operations_skipped[@]} -gt 0 ]; thenecho -e "${YELLOW}? 已跳過的操作:${NC}"printf " ? %s\n" "${operations_skipped[@]}"
fiecho -e "\n${BLUE}? 腳本執行完成,總耗時: ${PURPLE}${duration}秒${NC}"# 顯示最終用戶信息
echo -e "\n${PURPLE}════════════════════ 連接信息 ════════════════════${NC}"
echo -e "| ${CYAN}MySQL root用戶: ${PURPLE}root${NC} 密碼: ${PURPLE}123456${NC}"
echo -e "| ${CYAN}MySQL test用戶: ${PURPLE}test${NC} 密碼: ${PURPLE}123456 (可從任意主機連接)${NC}"
echo -e "${PURPLE}══════════════════════════════════════════════════${NC}"
三、腳本執行結果
腳本執行結束的結果如下,腳本執行之后,便可直接使用
test
用戶遠程MySQL服務,test
是擁有所有權限的遠程用戶
腳本執行結束信息輸出如下:
1. 登錄 mysql 測試
這里拿腳本最后給出的連接信息登錄MySQL數據庫,可以看到都可以符合腳本最后的輸出的用戶密碼信息登錄。
2. 遠程 mysql 測試
這里就不用 Navicat 軟件測試遠程,順手使用其他的虛擬機來測試,這里拿 Kali-Linux 的系統測試MySQL遠程連接,不管是用虛擬機遠程還是Navicat這些遠程數據庫工具,遠程測試結果都一樣的。 首先就是要和 mysql 服務端通信,可以看到 192.168.101.124
客戶端和 192.168.101.123
服務端通信,說明可以建立連接。
# 備注: mysql -h目標主機 -u用戶名 -p密碼
mysql -h192.168.101.123 -utest -p123456
備注:這里要補充一下,Kali Linux 默認使用的數據庫客戶端工具是基于 MariaDB 實現的。當你使用 mysql 命令行客戶端連接到遠程 MySQL 服務器時,客戶端可能會顯示自身的信息,也就是 MariaDB,但實際上連接的仍然是遠程的 MySQL 服務器。可以使用
select version();
查詢數據庫版本。
# 查詢數據庫的版本
select version();
這里可以看到連接的數據庫版本是 8.0.42
,說明連接的MySQL數據庫確實符合上面MySQL數據庫安裝的版本。