MySQL 8 自动安装脚本(CentOS-7 系统)

news2025/4/25 2:54:20

文章目录

  • 一、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. 给予脚本执行权限

这里是把脚本内容,在 vimINSERT (插入)模式下复制粘贴到新建的 文件名.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 ]; then
    echo -e "${RED}✖ 错误:此脚本必须以root用户身份运行!${NC}"
    echo -e "${YELLOW}请使用命令:sudo -i 切换到root用户后再执行本脚本${NC}"
    exit 1
else
    operations_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; then
    echo -e "${RED}✖ 错误:此脚本仅适用于CentOS 7系统!${NC}"
    echo -e "${YELLOW}检测到您的系统不是CentOS 7,请更换系统后再试${NC}"
    exit 1
else
    operations_done+=("检查系统版本为CentOS 7")
    echo -e "${GREEN}✓ 系统版本检查通过${NC}"
fi

echo -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; then
    operations_done+=("检测到MySQL已安装")
    echo -e "${YELLOW}⚠ 检测到MySQL已安装,将检查root密码...${NC}"

    # 先检查密码是否为123456
    echo -e "${CYAN}[执行] mysql -uroot -p'123456' -e \"SELECT 1\"${NC}"
    if mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; then
        operations_skipped+=("修改root密码(已经是123456)")
        echo -e "${GREEN}✓ 检测到MySQL root密码已经是123456,无需修改${NC}"
    else
        echo -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[@]}"; do
                IFS=':' 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;
EOF
                if [ $? -eq 0 ]; then
                    operations_done+=("使用${method_type}修改root密码")
                    return 0
                fi
            done

            # 如果常规方法都失败,尝试强制修改
            echo -e "${RED}✖ 所有常规方法失败,尝试强制修改密码...${NC}"
            echo -e "${CYAN}[执行] systemctl stop mysqld${NC}"
            systemctl stop mysqld || return 1
            echo -e "${CYAN}[执行] mysqld_safe --skip-grant-tables --skip-networking &${NC}"
            mysqld_safe --skip-grant-tables --skip-networking &
            sleep 5
            echo -e "${CYAN}[执行] mysql -uroot <强制修改密码SQL${NC}"
            mysql -uroot <<EOF
UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE User='root';
FLUSH PRIVILEGES;
EOF
            echo -e "${CYAN}[执行] pkill mysqld${NC}"
            pkill mysqld
            sleep 2
            echo -e "${CYAN}[执行] systemctl start mysqld${NC}"
            systemctl start mysqld
            if mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; then
                operations_done+=("强制修改root密码")
                return 0
            else
                return 1
            fi
        }

        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+=("恢复原密码策略")
        else
            echo -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 1
        fi
    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)" ]; then
        echo -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,所有权限)")
    else
        operations_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 ]; then
        echo -e "${YELLOW}⚠ 已跳过的操作:${NC}"
        printf "  • %s\n" "${operations_skipped[@]}"
    fi
    
    echo -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; then
    echo -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; then
        echo -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; then
            rm -f /tmp/mysql80-community-release-el7-7.noarch.rpm
            operations_done+=("安装MySQL Yum仓库")
            echo -e "${GREEN}✓ MySQL Yum仓库安装成功${NC}"
        else
            echo -e "${RED}✖ 安装MySQL Yum仓库失败!${NC}"
            exit 1
        fi
    else
        echo -e "${RED}✖ 下载MySQL Yum仓库失败!${NC}"
        exit 1
    fi
else
    operations_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; then
    operations_done+=("导入MySQL GPG密钥")
    echo -e "${GREEN}✓ GPG密钥导入成功${NC}"
else
    operations_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; then
    operations_done+=("安装MySQL服务器")
    echo -e "${GREEN}✓ MySQL服务器安装成功${NC}"
else
    echo -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-libs
    echo -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; then
        operations_done+=("安装MySQL服务器(经过清理后)")
        echo -e "${GREEN}✓ MySQL服务器安装成功(经过清理后)${NC}"
    else
        echo -e "${RED}✖ MySQL服务器安装仍然失败!${NC}"
        exit 1
    fi
fi

# 6. 启动MySQL服务
echo -e "${BLUE}▶ 6. 正在启动MySQL服务...${NC}"

echo -e "${CYAN}[执行] systemctl start mysqld${NC}"
if systemctl start mysqld; then
    operations_done+=("启动MySQL服务")
    echo -e "${CYAN}[执行] systemctl enable mysqld${NC}"
    systemctl enable mysqld && operations_done+=("设置MySQL开机自启")
    echo -e "${GREEN}✓ MySQL服务启动成功${NC}"
else
    echo -e "${RED}✖ 启动MySQL服务失败!尝试修复...${NC}"
    echo -e "${CYAN}[执行] chown -R mysql:mysql /var/lib/mysql${NC}"
    chown -R mysql:mysql /var/lib/mysql
    echo -e "${CYAN}[执行] systemctl start mysqld${NC}"
    if systemctl start mysqld; then
        operations_done+=("启动MySQL服务(经过修复后)")
        echo -e "${CYAN}[执行] systemctl enable mysqld${NC}"
        systemctl enable mysqld && operations_done+=("设置MySQL开机自启")
        echo -e "${GREEN}✓ MySQL服务启动成功(经过修复后)${NC}"
    else
        echo -e "${RED}✖ 仍然无法启动MySQL服务!${NC}"
        exit 1
    fi
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" ]; then
    echo -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; then
        temp_password="123456"
        operations_skipped+=("获取临时密码(已有密码123456)")
        echo -e "${YELLOW}⚠ 检测到已有密码123456,使用此密码${NC}"
    else
        echo -e "${CYAN}[执行] 检查是否可以空密码登录...${NC}"
        echo -e "${CYAN}[执行] mysql -uroot -e \"SELECT 1\"${NC}"
        if mysql -uroot -e "SELECT 1" >/dev/null 2>&1; then
            temp_password=""
            operations_skipped+=("获取临时密码(可以空密码登录)")
            echo -e "${YELLOW}⚠ 可以空密码登录MySQL${NC}"
        else
            echo -e "${RED}✖ 无法确定MySQL root密码!${NC}"
            exit 1
        fi
    fi
else
    operations_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;
EOF
    return $?
}

if set_mysql_password "$temp_password"; then
    operations_done+=("修改root密码为123456")
    echo -e "${GREEN}✓ root密码修改成功${NC}"
else
    echo -e "${RED}✖ 常规密码修改失败!尝试强制修改...${NC}"
    echo -e "${CYAN}[执行] systemctl stop mysqld${NC}"
    systemctl stop mysqld
    echo -e "${CYAN}[执行] mysqld_safe --skip-grant-tables --skip-networking &${NC}"
    mysqld_safe --skip-grant-tables --skip-networking &
    sleep 5
    echo -e "${CYAN}[执行] mysql -uroot <强制修改密码SQL${NC}"
    mysql -uroot <<EOF
UPDATE mysql.user SET authentication_string=PASSWORD('123456') WHERE User='root';
FLUSH PRIVILEGES;
EOF
    echo -e "${CYAN}[执行] pkill mysqld${NC}"
    pkill mysqld
    sleep 2
    echo -e "${CYAN}[执行] systemctl start mysqld${NC}"
    systemctl start mysqld
    if mysql -uroot -p'123456' -e "SELECT 1" >/dev/null 2>&1; then
        operations_done+=("强制修改root密码为123456")
        echo -e "${GREEN}✓ 强制修改root密码成功${NC}"
    else
        echo -e "${RED}✖ 强制修改密码失败!${NC}"
        exit 1
    fi
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; then
    echo -e "${CYAN}[执行] firewall-cmd --permanent --add-port=3306/tcp${NC}"
    if firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload; then
        echo -e "${CYAN}[执行] firewall-cmd --list-ports | grep -q 3306${NC}"
        if firewall-cmd --list-ports | grep -q 3306; then
            operations_done+=("防火墙已放行3306端口")
            echo -e "${GREEN}✓ 防火墙3306端口配置成功${NC}"
        else
            operations_skipped+=("防火墙配置可能未生效,请手动检查")
            echo -e "${YELLOW}⚠ 防火墙配置可能未生效,请手动检查${NC}"
        fi
    else
        operations_skipped+=("防火墙配置失败")
        echo -e "${YELLOW}⚠ 防火墙配置失败${NC}"
    fi
else
    operations_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; then
    operations_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}"
else
    echo -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)" ]; then
    echo -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}"
else
    operations_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 ]; then
    echo -e "${YELLOW}⚠ 已跳过的操作:${NC}"
    printf "  • %s\n" "${operations_skipped[@]}"
fi

echo -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数据库安装的版本。

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342093.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Notepad++中使用NppAtyle插件格式化代码

参考链接&#xff1a;Artistic Style 使用教程&#xff08;中文版&#xff09; 1.下载NppAStyle插件&#xff08;根据版本&#xff0c;选择32位或者64位&#xff09; https://github.com/ywx/NppAStyle/releases 2.菜单栏中选择&#xff1a;插件->打开插件文件夹 创建文件夹…

拼多多面经,暑期实习Java一面

项目中的设计模式 mysql连接过程&#xff0c;索引&#xff0c;分库分表场景&#xff0c;路由策略 redis使用场景&#xff0c;分片集群怎么搭建与路由&#xff0c;数据一致性 分布式锁怎么用的&#xff0c;具体使用参数 线程池怎么用的&#xff0c;过程 sql having 分布式事务 如…

FramePack:让视频生成更高效、更实用

想要掌握如何将大模型的力量发挥到极致吗&#xff1f;叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具&#xff08;限时免费&#xff09;。 1小时实战课程&#xff0c;您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型&#xff0c;以发挥其…

ctfshow web8

前言 学习内容&#xff1a;简单的盲注脚本的书写 web8 这个题目题目手动注入很麻烦 主要是他过滤了 union 空格和 过滤了union的解决方法 1、使用盲注(报错注入和盲注) 2、使用时间盲注 3、堆叠注入 盲注脚本的书写 首先他是有注入点的 然后熟悉requests包的使用 …

gem5-gpu教程03 当前的gem5-gpu软件架构(因为涉及太多专业名词所以用英语表达)

Current gem5-gpu Software Architecture 这是当前gem5-gpu软件架构的示意图。 Ruby是在gem5-gpu上下文中用于处理CPU和GPU之间内存访问的高度可配置的内存系统 CudaCore (src/gpu/gpgpu-sim/cuda_core.*, src/gpu/gpgpu-sim/CudaCore.py) Wrapper for GPGPU-Sim shader_cor…

TDengine 查询引擎设计

简介 TDengine 作为一个高性能的时序大数据平台&#xff0c;其查询与计算功能是核心组件之一。该平台提供了丰富的查询处理功能&#xff0c;不仅包括常规的聚合查询&#xff0c;还涵盖了时序数据的窗口查询、统计聚合等高级功能。这些查询计算任务需要 taosc、vnode、qnode 和…

【官方正版,永久免费】Adobe Camera Raw 17.2 win/Mac版本 配合Adobe22-25系列软

Adobe Camera Raw 2025 年 2 月版&#xff08;版本 17.2&#xff09;。目前为止最新版新版已经更新2个月了&#xff0c;我看论坛之前分享的还是2024版&#xff0c;遂将新版分享给各位。 Adobe Camera Raw&#xff0c;支持Photoshop&#xff0c;lightroom等Adobe系列软件&#…

【论文精读】Reformer:高效Transformer如何突破长序列处理瓶颈?

目录 一、引言&#xff1a;当Transformer遇到长序列瓶颈二、核心技术解析&#xff1a;从暴力计算到智能优化1. 局部敏感哈希注意力&#xff08;LSH Attention&#xff09;&#xff1a;用“聚类筛选”替代“全量计算”关键步骤&#xff1a;数学优化&#xff1a; 2. 可逆残差网络…

jmeter中监控服务器ServerAgent

插件下载&#xff1a; 将ServerAgent上传至需要监控的服务器&#xff0c;mac/liunx启动startAgent.sh&#xff08;启动命令&#xff1a;./startAgent.sh&#xff09; 在jmeter中添加permon监控组件 配置需要监控的服务器IP地址&#xff0c;添加需要监控的资源 注意&#xf…

网络结构及安全科普

文章目录 终端联网网络硬件基础网络协议示例&#xff1a;用户访问网页 OSI七层模型网络攻击&#xff08;Hack&#xff09;网络攻击的主要类别&#xff08;一&#xff09;按攻击目标分类&#xff08;二&#xff09;按攻击技术分类 网络安全防御 典型攻击案例相关名词介绍网络连接…

JVM虚拟机-JVM调优、内存泄漏排查、CPU飙高排查

一、JVM调优的参数在哪里设置 项目开发过程中有以下两种部署项目的方式&#xff1a; 项目部署在tomcat中&#xff0c;是一个war包&#xff1b;项目部署在SpringBoot中&#xff0c;是一个jar包。 (1)war包 catalina文件在Linux系统下的tomcat是以sh结尾&#xff0c;在windows系…

安全复健|windows常见取证工具

写在前面&#xff1a; 此博客仅用于记录个人学习内容&#xff0c;学识浅薄&#xff0c;若有错误观点欢迎评论区指出。欢迎各位前来交流。&#xff08;部分材料来源网络&#xff0c;若有侵权&#xff0c;立即删除&#xff09; 取证 01系统运行数据 使用工具&#xff1a;Live-F…

FPGA开发流程初识

FPGA 的开发流程可知&#xff0c;在 FPGA 开发的过程中会产生很多不同功能的文件&#xff0c;为了方便随时查找到对应文件&#xff0c;所以在开始开发设计之前&#xff0c;我们第一个需要考虑的问题是工程内部各种文件的管理。如 果不进行文件分类&#xff0c;而是将所有文件…

C# 类型、存储和变量(栈和堆)

本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 栈和堆 程序运行时&#xff0c;它的数据必须存储在内存中。一个数据项需要多大的内存、存储在什么地方…

基于深度学习Yolo8的驾驶员疲劳与分心行为检测系统

基于深度学习Yolo8的驾驶员疲劳与分心行为检测系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】疲劳检测模型与行为分析统计 【技术栈】 ①&#xff1a;系统环境&#xff1a;Windows/Mac/Linux ②&#xff1a;开发环境&#xff1a;P…

AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解

在 Launcher3 执行涉及其他应用窗口&#xff08;即“远程窗口”&#xff09;的动画时&#xff0c;例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画&#xff0c;SurfaceControl 扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。 …

Linux系统学习----概述与目录结构

linux 是一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发已经得到业界的认可&#xff0c;目前很多企业级的项目 (c/c/php/python/java/go)都会部署到 Linux/unix 系统上。 一、虚拟机系统操作 1.网络连接的三种方式&#xff08;桥接模式、nat模式、主机模…

虚拟列表技术深度解析:原理、实现与性能优化实战

虚拟列表技术深度解析&#xff1a;原理、实现与性能优化实战 引言 在当今数据驱动的互联网应用中&#xff0c;长列表渲染已成为前端开发的核心挑战。传统的一次性全量渲染方式在数据量超过千条时&#xff0c;往往导致页面卡顿、内存飙升等问题。虚拟列表&#xff08;Virtual L…

服务器简介(含硬件外观接口介绍)

服务器&#xff08;Server&#xff09;是指提供资源、服务、数据或应用程序的计算机系统或设备。它通常比普通的个人计算机更强大、更可靠&#xff0c;能够长时间无间断运行&#xff0c;支持多个用户或客户端的请求。简单来说&#xff0c;服务器就是专门用来存储、管理和提供数…

c++下的onnx推理

参考代码&#xff1a;https://github.com/itsnine/yolov5-onnxruntime 参考链接&#xff1a;https://blog.csdn.net/magic_ll/article/details/125517798 1.下载onnx 官网&#xff1a;https://github.com/microsoft/onnxruntime/releases/tag/v1.21.0 2.下载代码 https://g…