使用Shell脚本进行MySql权限修改的实现教程

 更新时间:2024年03月26日 11:47:34   作者:彩虹海。  
原先数据配置文件中有bind-address=127.0.0.1,注释掉此配置后,原数据库中默认带%root的权限,现在需要通过脚本实现白名单列表中的ip添加权限允许访问数据库,本文给大家介绍了使用Shell脚本进行MySql权限修改的实现教程,需要的朋友可以参考下

背景:

原先数据配置文件中有bind-address=127.0.0.1,注释掉此配置后,原数据库中默认带%root的权限,现在需要通过脚本实现白名单列表中的ip添加权限允许访问数据库,白名单之外的ip没有权限访问数据库。

以下是过程中记录的一些问题。

问题

1、能否直接通过将%@root替换成白名单中ip@root权限?

答:不能。

在 MySQL 中,无法将 %@root 直接更新为 whitelisted_ip@root 的权限。权限授予是基于用户和主机的,而不是根据特定的用户和权限项。这意味着不能直接更改权限项的主机部分。
相反,应该创建一个新的用户,并仅授予该用户特定主机的访问权限。然后,撤销原始的 %@root 用户的权限,以确保只有指定白名单中的 IP 地址能够访问数据库。

因此,在 MySQL 中创建新用户并设置仅限白名单 IP 地址访问数据库,然后删除默认的 %root 用户权限,是最安全和推荐的做法。

2、WITH GRANT OPTION 参数使用

WITH GRANT OPTION 是 MySQL 权限系统中的一种选项,它允许授予的用户将他们拥有的权限授予其他用户,即委派权限。具体而言,当你向用户授予权限时,可以选择是否包括 WITH GRANT OPTION,其含义如下:

授予权限:授予权限意味着该用户可以执行被授予的操作(例如 SELECT、INSERT、UPDATE 等)。
WITH GRANT OPTION:如果同时指定了 WITH GRANT OPTION,则被授予权限的用户除了可以执行这些操作外,还可以将相同的权限授予其他用户,即委派权限。

换句话说,具有 WITH GRANT OPTION 权限的用户可以再次使用 GRANT 命令将他们拥有的权限授予给其他用户,而不需要直接访问权限的所有者。这样的设置可以在需要委派权限给其他用户时非常有用。但同时也要注意,授予 WITH GRANT OPTION 权限可能增加安全风险,因为权限可能会被滥用或误用。

因此,在为用户分配权限时,应谨慎考虑是否使用 WITH GRANT OPTION,并确保了解委派权限可能带来的安全影响。

3、执行 REVOKE ALL PRIVILEGES ON . FROM ‘root’@‘%’;后,为什么查询user表依然包含此用户信息?

当使用 REVOKE ALL PRIVILEGES ON *.* FROM 'root'@'%'; 命令来撤销 root@% 用户的所有权限时,这只是取消了该用户对数据库的访问权限,并没有删除该用户的账户信息。因此,即使撤销了 root@% 的权限,仍然可以在 mysql.user 表中查询到该用户的记录。

要完全删除 root@% 用户的账户信息,可以使用以下步骤:

-- 使用 REVOKE 命令撤销 root@% 用户的所有权限:
REVOKE ALL PRIVILEGES ON *.* FROM 'root'@'%';
FLUSH PRIVILEGES;
--- 删除 root@% 用户的账户:
DROP USER 'root'@'%';

通过上述步骤,可以撤销 root@% 用户的所有权限,并从 mysql.user 表中删除该用户的账户信息。
请注意,删除 root@% 用户可能会影响到数据库的管理和维护,因此在执行此操作之前,请确保有其他具备管理员权限的用户账户。

4、部分细节参考

添加用户权限时如果用户权限不存在才添加;

删除用户权限时如果用户权限存在则删除;

不做添加删除判断,可能会执行报错。

数据连接相关信息存储在一个配置文件中test_config.sh;

test_config.sh文件参考

#!/bin/bash

export DBCMD=/usr/local/Test/database/bin/mysql
export DBUSER=root
export DBPWD=123456
export DBHOST=127.0.0.1
export DBPORT=3306
export WHITEIP=192.168.22.1

test_permission.sh文件参考

#!/bin/bash
pushd `dirname $0` >/dev/null 2>&1

. test_config.sh

# 检查白名单用户权限是否存在
existing_user=`$DBCMD -u$DBUSER -p$DBPWD -P$DBPORT -h$DBHOST -Ns -e "SELECT user FROM mysql.user WHERE user='root' AND host='${WHITEIP}'"`
if [ -z "$existing_user" ]; then
	# 如果用户权限不存在,则添加权限
	$DBCMD -u$DBUSER -p$DBPWD -P$DBPORT -h$DBHOST -e "create user 'root'@'${WHITEIP}' identified by '123456';grant all privileges on *.* to 'root'@'${WHITEIP}' identified by '123456' with GRANT OPTION;flush privileges;"
	# 记录时间、输出到日志文件
	echo `date "+%F %T"` "${WHITEIP} grant all privileges" >> ../test.log
else
	echo `date "+%F %T"` "${WHITEIP} is exist, no need to add" >> ../test.log
fi

# 检查root@%用户权限是否存在
existing_user=`$DBCMD -u$DBUSER -p$DBPWD -P$DBPORT -h $DBHOST -Ns -e "SELECT user FROM mysql.user WHERE user='root' AND host='%'"`
if [ -z "$existing_user" ]; then
	echo `date "+%F %T"` "root@% is not exist, no need to del" >> ../test.log
else
	# 如果用户权限存在,则删除权限
	$DBCMD -u$DBUSER -p$DBPWD -P$DBPORT -h$DBHOST -e "REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'root'@'%';DROP USER 'root'@'%';flush privileges;"
	echo `date "+%F %T"` "root@% rmvoke all privileges" >> ../test.log
fi

popd >/dev/null 2>&1

到此这篇关于使用Shell脚本进行MySql权限修改的实现教程的文章就介绍到这了,更多相关Shell脚本修改MySql权限内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql中如何使用正则表达式查询

    mysql中如何使用正则表达式查询

    这篇文章主要介绍了mysql中如何使用正则表达式查询,需要的朋友可以参考下
    2014-06-06
  • 导致MySQL错误1064的原因及最佳解决方案

    导致MySQL错误1064的原因及最佳解决方案

    用户可以通过修正相关的 SQL 查询来解决 MySQL 语法错误 1064,错误信息本身会突出显示查询中出现问题的行号,常见的修复方法包括检查输入错误的命令、替换已废弃的命令以及处理数据库损坏,本文将解释导致错误 1064 的主要原因,并提供一些经过尝试和验证的解决方案
    2026-03-03
  • MySQL一个语句查出各种整形占用字节数及最大最小值的实例

    MySQL一个语句查出各种整形占用字节数及最大最小值的实例

    下面小编就为大家带来一篇MySQL一个语句查出各种整形占用字节数及最大最小值的实例。
    2017-03-03
  • MySQL 8.0用户和角色管理原理与用法详解

    MySQL 8.0用户和角色管理原理与用法详解

    这篇文章主要介绍了MySQL 8.0用户和角色管理,结合实例形式分析了MySQL 8.0用户和角色管理相关概念、功能、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • MySQL中like模糊查询的优化方法小结

    MySQL中like模糊查询的优化方法小结

    本文介绍了五种优化MySQL中like模糊查询的方法,主要包含后缀匹配走索引、反向索引、缩小搜索范围、使用缓存和借助全文搜索引擎这几种,感兴趣的可以了解一下
    2024-11-11
  • MySQL中根据出生日期计算年龄两种方法

    MySQL中根据出生日期计算年龄两种方法

    使用SQL语句计算年龄,在事务处理和日期计算中,较为常见,下面这篇文章主要给大家介绍了关于MySQL中根据出生日期计算年龄的两种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • MySQL Error 1449错误的解决方法

    MySQL Error 1449错误的解决方法

    MySQL Error 1449 错误信息为 “The user specified as a definer ('user'@'host') does not exist”,意思是定义者在当前系统中不存在,从而导致无法正常使用这些对象,本文针对该错误介绍了详细解决方法,需要的朋友可以参考下
    2025-02-02
  • MySQL和Redis之间的存储区别

    MySQL和Redis之间的存储区别

    MySQL是一种关系型数据库,而Redis是一种键值对存储数据库,虽然它们都是用来存储和管理数据的,但是它们在很多方面都有不同,本文就给大家详细介绍一下MySQL和Redis之间的存储区别,感兴趣的同学可以参考一下
    2023-06-06
  • Mysql 模糊查询和正则表达式实例详解

    Mysql 模糊查询和正则表达式实例详解

    在MySQL中,可以使用LIKE运算符进行模糊查询,LIKE运算符用于匹配字符串模式,其中可以使用通配符来表示任意字符或字符序列,这篇文章主要介绍了Mysql 模糊查询和正则表达式实例详解,需要的朋友可以参考下
    2023-11-11
  • MySQL如何追踪数据库中对特定表的更新操作

    MySQL如何追踪数据库中对特定表的更新操作

    这篇文章主要为大家详细介绍了五种不同的方法 来追踪 MySQL 数据库中对特定表(如 statistics_test)的更新操作,并提供详细的代码示例和适用场景分析,希望对大家有所帮助
    2025-06-06

最新评论