我正在尝试编写一个简单的shell脚本来为这个用户创build新的mysql用户和数据库。 由于我不想使用mysql root帐户,所以我创build了一个新用户(让我们称他为“创build者”)。 我给了他INSERT, SELECT, UPDATE, CREATE, CREATE USER, GRANT
权限,但是我不能授予访问权为新用户创build一个数据库。
脚本看起来像这样:
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'
。 当我作为“创造者”login时,我得到了同样的错误,因为“创build者”具有GRANT特权。 那么,“创造者”缺less了什么特权呢? 我希望他有尽可能最小的特权。
这里的问题非常简单。 看看事物的顺序:
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;
。
考虑到这些因素,您可以使用自己的数据库创build新用户:
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
,请按如下所示创build用户:
步骤01)作为root@localhost
,login到mysql并运行
SELECT PASSWORD('creatorpassword');
这将返回一个41个字符的MD5类似的string。
步骤02)作为root@localhost
,login到mysql并运行
SET SQL_LOG_BIN=0; GRANT ALL PRIVILEGES ON *.* to creator@localhost IDENTIFIED BY PASSWORD '41-character MD5-like string';
这将创build用户并设置其密码。 如果您启用了二进制日志logging,则第一行SET SQL_LOG_BIN=0
只是防止将命令logging在二进制日志中。
步骤03)从mysql的审计历史logging中删除命令。
每次login到mysql时,这些命令都logging在一个名为.mysql_history
的文件中。 跑步
cd vi .mysql_history
一旦你进入vi
,运行/SELECT PASSWORD
,按回车。 这会将您置于从文本打印PASSWORDfunction的命令行。 只需打dd
和ZZ
,就完成了。
outlook未来,您可以使用创build者@ localhost,拥有与root @ localhost相同的权限,并且您已经很好地隐藏了密码。 你将只需要保持其完整性。
目前,根据下面的评论,我认为问题是creator
用户没有权限试图授予新用户帐户。
根据文件 ,
您不能授予其他用户您自己没有的权限
所以我明白你希望让creator
帐号拥有尽可能less的特权,但这不是MySQL特权模式的工作原理; 要将newdb。*上的ALL授予newuser,创build者还需要newdb。*上的ALL以及GRANT特权。