我正在尝试编写一个简单的 shell 脚本来为该用户创建新的 mysql 用户和数据库。由于我不想使用 mysql root 帐户,因此我创建了一个新用户(我们称他为“创建者”)。我授予了他INSERT, SELECT, UPDATE, CREATE, CREATE USER, GRANT
权限,但我无法授予新用户创建数据库的权限。
脚本看起来是这样的:
myuser=creator
mypass=xxxx
dbuser=newuser
dbname=newdb
mysql -u$myuser -p$mypass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';";
mysql -u$myuser -p$mypass -rs -e "GRANT USAGE ON * . * TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
mysql -u$myuser -p$mypass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;";
mysql -u$myuser -p$mypass -rs -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';";
mysql -u$myuser -p$mypass -rs -e "FLUSH PRIVILEGES ;";
我得到了ERROR 1044 (42000) at line 1: Access denied for user 'creator'@'localhost' to database 'newdb'
。当我以“creator”身份登录时,我得到了相同的错误,这很奇怪,因为“creator”具有 GRANT 权限。那么,“creator”缺少什么权限?我希望他拥有尽可能少的权限。
答案1
这里的问题很简单。看一下事情的顺序:
mysql -u$myuser -p$mypass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';";
mysql -u$myuser -p$mypass -rs -e "GRANT USAGE ON *. * TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
mysql -u$myuser -p$mypass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;";
mysql -u$myuser -p$mypass -rs -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';";
mysql -u$myuser -p$mypass -rs -e "FLUSH PRIVILEGES ;";
前三(3)行无法通过 执行,$myuser
因为 。必须由超级用户(例如root@localhost
)执行前三行。
这里有一些补充:仅root@localhost
可以执行FLUSH PRIVILEGES;
。但是,这甚至没有必要,因为GRANT
命令内部执行FLUSH PRIVILEGES;
。
考虑到这些因素,您可以按照以下方式创建具有自己的数据库的新用户:
rootuser=root
rootpass=rootpassword
myuser=creator
mypass=xxxx
dbuser=newuser
dbname=newdb
mysql -u$rootuser -p$rootpass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';";
mysql -u$rootuser -p$rootpass -rs -e "GRANT USAGE ON *.* TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
mysql -u$rootuser -p$rootpass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;";
mysql -u$rootuser -p$rootpass -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';";
如果您确实不想使用用户root@localhost
,请按如下方式创建用户:
步骤 01)root@localhost
登录 mysql 并运行
SELECT PASSWORD('creatorpassword');
这将返回一个 41 个字符的类似 MD5 的字符串。
步骤 02)root@localhost
登录 mysql 并运行
SET SQL_LOG_BIN=0;
GRANT ALL PRIVILEGES ON *.* to creator@localhost IDENTIFIED BY PASSWORD '41-character MD5-like string';
这将创建用户并设置其密码。第一行SET SQL_LOG_BIN=0
只是阻止命令被记录在二进制日志中(如果您启用了二进制日志)。
步骤 03)从 mysql 的审计历史记录中删除命令。
每次登录 mysql 时,命令都会记录在名为的文件中.mysql_history
。运行
cd
vi .mysql_history
进入 后vi
,运行/SELECT PASSWORD
,按回车键。这将使您处于执行从文本打印 PASSWORD 函数的命令的行。只需按dd
和ZZ
,您就完成了。
接下来,您可以使用与 root@localhost 相同的权限来使用 creator@localhost,并且您已经很好地隐藏了密码。您只需保持其完整性即可。
答案2
目前,根据以下评论,我认为问题在于用户creator
没有尝试授予帐户的权限newuser
。
根据文档,
您不能授予其他用户您自己没有的权限
因此,我理解您希望帐户拥有creator
尽可能少的权限,但这不是 MySQL 权限模型的工作方式;要将 newdb 上的 ALL 授予 newuser,创建者还需要 newdb 上的 ALL,以及 GRANT 权限。