MySQL 巡检用户创建脚本(Python 版)
脚本依赖
需先安装 MySQL 官方 Python 连接器,执行以下命令安装:
pip install mysql-connector-python
完整 Python 脚本
import os
import getpass
import mysql.connector
from mysql.connector import Error
# 终端颜色配置(兼容大多数终端)
class Color:
BLUE = '\033[34m' # 蓝色(开始/完成提示)
RED = '\033[31m' # 红色(错误/警告)
GREEN = '\033[32m' # 绿色(成功提示)
RESET = '\033[0m' # 重置颜色
def print_separator():
"""打印分隔线,统一输出格式"""
print("-" * 31)
def connect_mysql(root_user, root_pwd, host="localhost", port="3306"):
"""
连接 MySQL 数据库
返回:数据库连接对象(成功)/ None(失败)
"""
try:
conn = mysql.connector.connect(
user=root_user,
password=root_pwd,
host=host,
port=port,
auth_plugin='mysql_native_password' # 兼容 MySQL 5.x/8.x 认证
)
if conn.is_connected():
return conn
except Error as e:
print(f"\n{Color.RED}MySQL 连接失败:{str(e)}{Color.RESET}")
# 常见错误提示
if "Access denied" in str(e):
print(f"{Color.RED}可能原因:root 密码错误 / 该 IP 无访问权限{Color.RESET}")
elif "Can't connect to MySQL server" in str(e):
print(f"{Color.RED}可能原因:MySQL 服务未启动 / 端口被占用{Color.RESET}")
return None
def get_mysql_version(conn):
"""获取 MySQL 主版本号(5 或 8)"""
try:
cursor = conn.cursor()
cursor.execute("SELECT version()")
version_str = cursor.fetchone()[0] # 示例:5.7.36 / 8.0.32
main_version = int(version_str.split('.')[0])
cursor.close()
print(f"\n{Color.GREEN}数据库版本:{version_str}{Color.RESET}")
return main_version
except Error as e:
print(f"\n{Color.RED}获取版本失败:{str(e)}{Color.RESET}")
return None
def check_zyjc_user(conn):
"""检查 zyjc@% 用户是否已存在"""
try:
cursor = conn.cursor()
# 精确查询 zyjc@%(修复原脚本主机匹配问题)
cursor.execute("SELECT 1 FROM mysql.user WHERE user = 'zyjc' AND host = '%'")
result = cursor.fetchone()
cursor.close()
return result is not None # 存在返回 True,不存在返回 False
except Error as e:
print(f"\n{Color.RED}检查用户失败:{str(e)}{Color.RESET}")
return False
def execute_sqls(conn, sql_list):
"""批量执行 SQL 语句"""
try:
cursor = conn.cursor()
for sql in sql_list:
# 打印当前执行的 SQL 描述(非原始 SQL,避免密码泄露)
if "CREATE USER" in sql:
print(f"\n{Color.BLUE}(2) 创建 zyjc@% 用户{Color.RESET}")
elif "GRANT SELECT" in sql:
print(f"{Color.BLUE}(3) 授予普通表查询权限{Color.RESET}")
elif "GRANT SHOW DATABASES" in sql:
print(f"{Color.BLUE}(3) 授予 SHOW DATABASES 权限{Color.RESET}")
elif "GRANT PROCESS" in sql:
print(f"{Color.BLUE}(3) 授予线程查询权限{Color.RESET}")
elif "GRANT REPLICATION CLIENT" in sql:
print(f"{Color.BLUE}(3) 授予主从复制查询权限{Color.RESET}")
elif "GRANT SERVICE_CONNECTION_ADMIN" in sql:
print(f"{Color.BLUE}(3) 授予 MySQL 8.x 专属连接权限{Color.RESET}")
elif "FLUSH PRIVILEGES" in sql:
print(f"\n{Color.BLUE}(4) 刷新权限缓存{Color.RESET}")
# 执行 SQL
cursor.execute(sql)
conn.commit()
cursor.close()
print(f"\n{Color.GREEN}用户创建与授权完成!{Color.RESET}")
print(f"{Color.GREEN}用户名:zyjc@% | 初始密码:Gs5tgb%TGB6yhn^YHN{Color.RESET}")
return True
except Error as e:
conn.rollback()
print(f"\n{Color.RED}SQL 执行失败:{str(e)}{Color.RESET}")
return False
def main():
# 1. 初始界面
print_separator()
print(f"| {Color.BLUE}BEGIN!!!{Color.RESET} |")
print_separator()
# 2. 输入 root 密码(隐藏输入,避免明文泄露)
print("\n(1) 请输入 MySQL root 用户密码")
root_pwd = getpass.getpass(prompt="root 密码:")
if not root_pwd:
print(f"\n{Color.RED}密码不能为空!{Color.RESET}")
return
# 3. 连接 MySQL
conn = connect_mysql(root_user="root", root_pwd=root_pwd)
if not conn:
return # 连接失败直接退出
try:
# 4. 获取 MySQL 主版本
main_version = get_mysql_version(conn)
if main_version not in [5, 8]:
print(f"\n{Color.RED}不支持的 MySQL 版本(仅支持 5.x/8.x){Color.RESET}")
return
# 5. 检查 zyjc@% 用户是否存在
user_exist = check_zyjc_user(conn)
if user_exist:
print(f"\n{Color.RED}用户 zyjc@% 已存在!无需重复创建!{Color.RESET}")
return
# 6. 生成对应版本的 SQL 列表(统一用户主机为 %,修复原脚本 Bug)
zyjc_password = "Gs5tgb%TGB6yhn^YHN" # 初始密码,可根据需求修改
sql_list = [
# 创建用户(指定 % 主机)
f"CREATE USER 'zyjc'@'%' IDENTIFIED BY '{zyjc_password}';",
# 基础权限
"GRANT SELECT ON *.* TO 'zyjc'@'%';",
"GRANT SHOW DATABASES ON *.* TO 'zyjc'@'%';",
"GRANT PROCESS ON *.* TO 'zyjc'@'%';",
"GRANT REPLICATION CLIENT ON *.* TO 'zyjc'@'%';",
# 刷新权限
"FLUSH PRIVILEGES;"
]
# MySQL 8.x 新增必要权限(修复监控连接问题)
if main_version == 8:
sql_list.insert(-1, "GRANT SERVICE_CONNECTION_ADMIN ON *.* TO 'zyjc'@'%';")
# 7. 执行 SQL 并创建用户
execute_sqls(conn, sql_list)
finally:
# 8. 关闭数据库连接
if conn.is_connected():
conn.close()
# 9. 结束界面
print("\n" * 2)
print_separator()
print(f"| {Color.BLUE}COMPLETION!!!{Color.RESET} |")
print_separator()
if __name__ == "__main__":
main()
脚本使用方法
- 将脚本保存为
create_zyjc_user.py。 - 执行脚本:
python create_zyjc_user.py - 按照提示输入 MySQL root 密码,脚本会自动完成版本适配、用户检查、权限授予。
浙公网安备 33010602011771号