MySQL 8 自动安装脚本(CentOS-7 系统)
文章目录
- 一、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数据库安装的版本。
相关文章:
MySQL 8 自动安装脚本(CentOS-7 系统)
文章目录 一、MySQL 8 自动安装脚本脚本说明📌 使用脚本前提条件1. 操作系统2. 用户权限3. 网络要求 📌 脚本的主要功能1. 环境检查2. MySQL 自动安装3. 自动配置 MySQL4. 防火墙配置5. 验证与输出 📌 适用场景 二、执行sh脚本1. 给予脚本执行…...
软件测试基础知识(2) -- 软件评测师(十三)
3 基于风险的测试 风险是当前未发生而未来有肯会发生并造成一定负面影响的事件。 3.1 基于风险的测试概述 (1)测试计划内容的核心: 1)测什么:从风险出发,需要明确地列举出要测试哪些具体的功能和非功能的质…...
axios 在请求拦截器中设置Content-Type无效问题
Axios 会根据请求数据自动设置 Content-Type: 当请求体为空时,Axios 会移除 Content-Type 头部 当请求体为对象时,默认设置为 application/json 当请求体为 URLSearchParams 时,默认设置为 application/x-www-form-urlencoded …...
MFC案例:使用键盘按键放大、缩小窗口图像的实验
当在对话框窗口居中显示一幅图像时,图像的尺寸可能大于或小于窗口的尺寸,这时我们希望通过使用按键“”进行图像放大显示,使用按键“-”进行缩小显示(当然也可以使用其它按键)。下面开始使用MFC进行这个实验࿰…...
本地(NAS/服务器)与云端(Docker/Kubernetes)部署详解与对比
本地(NAS/服务器)与云端(Docker/Kubernetes)部署详解与对比 一、本地部署(NAS/服务器) 适用场景: 需要完全控制硬件和数据(如隐私敏感场景)。小规模应用或测试环境。网…...
如何解决极狐GitLab 合并冲突?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 合并冲突 (BASIC ALL) 合并冲突发生在合并请求的两个分支(源分支和目标分支)对相同代码行进行了不同…...
DeepSeek在物联网设备中的应用:通过轻量化模型实现本地化数据分析
文章目录 一、引言二、DeepSeek轻量化模型的技术原理1. 模型量化2. 模型剪枝3. 动态精度调整 三、本地化数据分析的实现路径1. 硬件环境配置2. 模型加载与推理3. 数据预处理与后处理 四、行业应用案例1. 医疗智能穿戴设备2. 工业设备预测性维护3. 智能家居能耗优化 五、性能优化…...
opencv--图像
像素(像素点) 定义: Pixel 是 Picture Element(图像元素)的缩写,是数字图像中最小的独立单位。每个像素代表图像中的一个点的颜色和亮度信息。 关键特性: 颜色:通过不同的色彩模型(如RGB、CMYK…...
【KWDB 创作者计划】_嵌入式硬件篇---数字电子器件
文章目录 前言一、系列前缀(如 "74" 或 "54")74(商用级)54(工业级)二、逻辑家族(如 "LS"、"HC"、"HCT" 等)TTL(晶体管-晶体管逻辑)家族CMOS(互补金属氧化物半导体)家族BiCMOS(双极 CMOS)家族三、功能编号(如…...
前端加密介绍与实战
前端数据加密 文章目录 前端数据加密前端数据加密介绍为什么需要前端数据加密?前端数据加密的常见方式前端数据加密的实现场景:加密用户密码并发送到后端步骤 1:安装加密库步骤 2:实现加密逻辑步骤 3:后端解密 实战总结…...
DAG(有向无环图)计算模型面试内容整理-拓扑排序(Topological Sort)和节点依赖与并行度
拓扑排序(Topological Sort) 拓扑排序(Topological Sort): 拓扑排序是针对有向无环图(DAG)的一种线性排序方法。这种排序方法的特点是,对于DAG中的每一条有向边 (A → B),在拓扑排序中节点A总是排在节点B之前。...
AI语音助手自定义角色百度大模型 【全新AI开发套件掌上AI+4w字教程+零基础上手】
1、简介 此项目主要使用ESP32-S3实现一个自定义角色的AI语音聊天助手(比如医生角色),可以通过该项目熟悉ESP32-S3 arduino的开发,百度语音识别,百度语音合成API调用,百度APPBuilder API的调用实现自定义角…...
【Java面试笔记:基础】13.谈谈接口和抽象类有什么区别?
在 Java 中,接口(Interface) 和 抽象类(Abstract Class) 都是实现多态和代码抽象的机制,但它们在设计目的、语法特性及使用场景上有显著差异。 1. 接口和抽象类的区别 接口(Interface) 定义:接口是对行为的抽象,是抽象方法的集合,用于定义 API 规范。 特点: 不能…...
内存管理(Linux程序设计)
内存管理 目录 内存管理 一.简单的内存分配 代码功能概述 代码流程图 变量声明 动态内存分配 内存分配错误检查 向内存写入字符串 设置退出状态并退出程序 二.请求全部的物理内存 代码功能概述 变量声明 三..可用内存 四.滥用内存 1.代码功能(预期 …...
Prompt 结构化提示工程
Prompt 结构化提示工程 目前ai开发工具都大同小异,随着deepseek的流行,ai工具的能力都差不太多,功能基本都覆盖到了。而prompt能力反而是需要更加关注的(说白了就是能不能把需求清晰的输出成文档)。因此大家可能需要加…...
Postman设置了Cookies但是请求不携带Cookie
1 问题说明 使用Postman工具往往要向本地服务器发送请求携带Cookie便于测试接口,但是在Send下面的Cookies选项中设置域名127.0.0.1,并添加Cookie,发现发送的请求怎么都不会携带Cookie: 通过Fiddler抓包发现并没有Cookie࿱…...
微服务Nacos组件的介绍、安装、使用
微服务Nacos组件的介绍、安装、使用 在微服务架构日渐普及的今天,服务注册与配置管理成了系统架构中的关键环节。阿里巴巴开源的 Nacos(Naming and Configuration Service)正是解决这一问题的利器。本文将为你全面介绍 Nacos 的概念、安装方…...
深度剖析塔能科技精准节能方案:技术创新与实践价值
在能源管理领域不断追求高效与可持续发展的进程中,塔能科技的精准节能方案逐渐成为行业内备受瞩目的焦点。 精准节能:核心技术与实现路径 塔能科技的精准节能理念建立在对能源消耗的精细监测与深度分析基础之上。以其节能管理平台为例,该平台…...
AI PPT创作原理解析:让你的演示文稿更智能
在当今信息爆炸的时代,演示文稿已成为我们工作和学习中不可或缺的一部分。然而,制作一份高质量的PPT往往需要投入大量的时间和精力。随着人工智能技术的迅猛发展,AI PPT创作工具应运而生,极大地简化了PPT的制作过程。本文将深入解…...
ollama本地搭建大模型
dajdaj人工智能,现在流行的大模型有很多,像流行的:gpt-3.5-turbo、通义千问2.5,Llama3; 本地安装大模型有什么好处 大模型都是开源的,安装在自己的电脑上也是免费使用的;可以结合自己的私有文…...
AIGC(生成式AI)试用 31 -- AI做软件程序测试 2
接上文 AIGC(生成式AI)试用 30 -- AI做软件程序测试 1 整合测试项提问并输出测试用例思考并调整提问方式,为完整的输年程序测试提问准备 - 再次对需求提问 --> 实际是之前的提问记录找不到了,不过有新发现;不妨后…...
【深度学习与大模型基础】第13章-什么是机器学习
1. 什么是机器学习? 想象你在教一个小朋友认猫: 传统编程:你写一本《猫的100条特征手册》(比如有胡须、尖耳朵),让计算机对照检查。 机器学习:你直接给计算机看1000张猫和狗的图片,…...
大数据利器Kafka
大数据利器Kafka:从入门到实战的全面指南 在大数据的世界里,Kafka就像是一个高效的“数据快递员”,负责在不同的系统之间快速、可靠地传递数据。今天,咱们就一起来深入了解一下这个强大的工具。Kafka是由LinkedIn开发的分布式发布…...
工具指南:免费将 PDF 转换为 Word 的 10 个工具
可移植文档格式或 PDF 是大多数企业使用的流行文件格式,主要用于共享项目材料并确保整个团队协同工作。它还有助于避免处理大量文档和丢失关键数据。使用顶级 PDF 转换器还可以更轻松地高效地进行日常活动。企业可以依靠专业的文档扫描服务对其他格式的文档进行 PDF…...
Elasticsearch复习笔记
文章目录 ES 基础为什么用 Elasticsearch初识和安装概述安装 elasticsearch安装 Kibana 倒排索引正向索引倒排索引正向和倒排 基础概念文档和字段索引和映射MySQL 和 elasticsearch IK 分词器安装 IK 分词器使用 IK 分词器拓展词典 ES 索引库操作Mapping 映射属性ES 索引库的 C…...
STM32 SysTick定时器
一、SysTick系统定时器概述 1.1 什么是SysTick定时器 SysTick(System Tick Timer)是ARM Cortex-M系列处理器内核集成的24位系统定时器,作为ARM架构的标准外设,它被深度整合在NVIC(嵌套向量中断控制器)中。…...
Modbus TCP协议介绍、原理解析与应用示例
深入了解Modbus TCP协议:介绍、原理解析与应用示例 在工业自动化领域,设备之间的通信与数据交换至关重要。Modbus协议作为一种经典的通信协议,因其简单、开放和易于实现的特点,被广泛应用于各种工业设备之间的数据传输。而Modbus…...
Elasticsearch 报错 Limit of total fields [1000] has been exceeded
一、错误代码: spring boot 链接es 插入审计日志数据报错: Caused by: org.elasticsearch.ElasticsearchException: Elasticsearch exception [typeillegal_argument_exception, reasonLimit of total fields [1000] has been exceeded while adding ne…...
maven中pom.xml setting.xml关系
1 在Spring Boot项目中,pom.xml和settings.xml文件都可以配置Maven仓库地址,但它们的作用和优先级有所不同。 ● settings.xml: ○ 配置本地仓库:使用 <localRepository> 元素指定本地仓库的路径。 ○ 配…...
PubLayNet:文档布局分析领域的大规模数据集
PubLayNet:文档布局分析领域的大规模数据集 1. 数据集概述 PubLayNet(Public Layout Network)是由IBM AUR NLP团队开发的大规模文档图像数据集,旨在推动文档理解与布局分析领域的研究。该数据集通过自动标注技术,对科…...
JAVA----方法
好久没发博客了~~~~~重生之我开始补知识 1.What is 方法(method) 方法是程序中最小的执行单元。 简单来说,就是将一些重复代码打包,要用的时候我们进行调用就好! e.g. public static void main(String…...
mybatis xml中特殊字符处理
1,CDATA区: 它的全称为character data,以"<![CDATA[ "开始,以" ]]>" 结束,在两者之间嵌入不想被解析程序解析的原始数据,解析器不对CDATA区中的内容进行解析,而是将这些数据原封…...
vue3+dhtmlx 甘特图真是案例
使用vue3 ts dhtmlx 实现项目任务甘特图展示 支持拖拽,选择人员,优先级,开发状态,进度 效果图 完整代码 安装命令:npm i dhtmlx-gantt <template><div style"height: 100%; background-color: white…...
Chrome/Edge浏览器使用多屏完美解决方案,http部署使用https部署的功能
多屏使用场景:例如1屏显示录入操作界面,2屏显示SOP。或者每个屏上显示不同的看板内容等 废话不少说,直接上代码:将下面的代码复制到txt记事本里,保存为html格式即可本地观看效果 <!DOCTYPE html> <html>…...
Linux中进程的属性:状态
一、通用OS进程中的各种状态与相关概念 1.1通用进程中的状态 CPU执行进程代码,不是把进程执行完才开始执行下一个,而是给每个进程预分配一个“时间片”, CPU基于时间片进行轮转调度(每个CPU分别进行) 其中发涉及到的…...
软件架构师常用的软件工具有哪些
软件架构师的工作离不开多种工具的支撑,主要包括 建模与设计工具、文档与协作平台、代码质量与静态分析工具、性能与监控工具、DevOps 工具链、架构可视化与管理平台 等。其中,建模与设计工具 是架构师最核心的武器,能够帮助其从业务抽象到技…...
rl中,GRPO损失函数详解。
文章目录 **一、GRPO损失函数的设计背景****二、代码逐行解析****三、关键组件详解****1. 对数概率与KL散度计算****2. 优势值与策略梯度****3. 掩码与平均损失****四、训练动态与调参建议**在TRL(Transformer Reinforcement Learning)库中,GRPO(Group Relative Policy Opt…...
奇安信春招面试题
奇安信面试真题,以下是5道具有代表性的经典技术面试题及其解析,覆盖网络安全、渗透测试、安全架构设计等核心领域。 《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.…...
MineWorld,微软研究院开源的实时交互式世界模型
MineWorld是什么 MineWorld是微软研究院开发并开源的一个基于《我的世界》(Minecraft)的实时互动世界模型。该模型采用了视觉-动作自回归Transformer架构,将游戏场景和玩家动作转化为离散的token ID,并通过下一个token的预测进行…...
Nginx RTMP配置存储位置
window: 支持本地磁盘和远程网络位置 配置文件如下 worker_processes 1;events {worker_connections 1024; }#RTMP服务 rtmp {server { listen 1935; #监听端口chunk_size 4096; #数据传输块大小application my_live { # 创建rtmp应用hlslive on; # 当路径匹…...
JVM理解(通俗易懂)
虽然网上有很多关于JVM的教程,但是都天花乱坠,很多都是一上来就JVM内存模型、JVM双亲委派等等,(可能我比较菜看不懂)。于是我自己决定写一篇能看懂的文章~如果有看不懂我就自己百度,大家有什么疑问也可以评论区交流~ 欢迎指点我的Error~ JVM概念 JVM大家都知道,就Ja…...
python三维矩阵的维度
matrix_3x3x3 np.array([[[ 8.35, 16.72, 17.46],[16.72, 33.49, 34.97],[17.46, 34.97, 36.51]],[[16.72, 33.49, 34.97],[33.49, 67.09, 70.05],[34.97, 70.05, 73.13]],[[17.46, 34.97, 36.51],[34.97, 70.05, 73.13],[36.51, 73.13, 76.35]] ]) 例如这样的三维矩阵&#…...
HarmonyOS 是 Android 套壳嘛?
文章目录 HarmonyOS 是 Android 套壳吗?技术视角的深度解析一、核心结论二、技术对比:从底层到应用层1. 内核与基础架构2. 应用开发与运行机制3. 生态与应用场景 三、常见误解的澄清误解 1:“HarmonyOS 使用 Android 应用,所以是套…...
【Java面试笔记:基础】10.如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?
1. 保证集合线程安全的方式 传统同步容器:如 Hashtable 和 Vector,通过在方法上加 synchronized 关键字实现线程安全,但性能较低。同步包装器:通过 Collections.synchronizedMap 等方法将普通集合包装成线程安全的集合,但仍然使用粗粒度的锁,性能不佳。List<String>…...
【Amazing晶焱科技高速 CAN Bus 传输与 TVS/ESD/EOS 保护,将是车用电子的生死关键无标题】
台北国际车用电子展是亚洲地区重量级的车用电子科技盛会,聚焦于 ADAS、电动车动力系统、智慧座舱、人机界面、车联网等领域。各大车厂与 Tier 1 供应链无不摩拳擦掌,推出最新技术与创新解决方案。 而今年,“智慧座舱” 无疑将成为全场焦点&am…...
电控---DMP库
一、DMP库的本质与核心定位 DMP库是为Invensense(现TDK)系列传感器(如MPU6050、MPU9250等)内置的数字运动处理器(DMP)硬件模块提供的软件接口层。其核心目标是: 抽象硬件操作:将复…...
YOLO数据处理
YOLO(You Only Look Once)的数据处理流程是为了解决目标检测领域的核心挑战,核心目标是为模型训练和推理提供高效、规范化的数据输入。其设计方法系统性地解决了以下关键问题,并对应发展了成熟的技术方案: 一、解决的问…...
Linux实现网络计数器
1.TcpServer.hpp文件 类TcpServer的私有成员变量有端口号,指向类Socket对象的指针,布尔值表示是否运行,以及回调函数,ioservice_t是表示参数为指向Socket对象的指针和InetAddr对象的函数,TcpServer类的构造函数接收端…...
数据分析:用Excel做周报
目录 1.初始模板 编辑 2.填充数据 2.1 日期以及表头 2.2 数据验证 2.3 计算数据填充 2.3.1 灵活计算 2.3.2 单独计算 2.3.3 总计 2.4 数据格式 2.5 周累计 2.6 周环比 2.7 业务进度 3 美化 1.初始模板 2.填充数据 2.1 日期以及表头 结果指标有以下这些&#…...
初阶数据结构--排序算法(全解析!!!)
排序 1. 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些些关键字的大小,递增或递减的排列起来的操作。 2. 常见的排序算法 3. 实现常见的排序算法 以下排序算法均是以排升序为示例。 3.1 插入排序 基本思想:…...