O problema aqui é muito simples. Veja a ordem das coisas:
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 ;";
As primeiras três (3) linhas não podem ser realizadas por $myuser
porque. Um superusuário (como root@localhost
) deve executar as primeiras três linhas.
Aqui está algo adicional: somente root@localhost
pode executar FLUSH PRIVILEGES;
. No entanto, isso nem é necessário porque o comando GRANT
executa internamente FLUSH PRIVILEGES;
.
Com isso em mente, é assim que você pode criar novos usuários com seu próprio banco de dados:
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';";
Se você não quiser realmente usar o usuário root@localhost
, crie o usuário da seguinte maneira:
Passo 01) Como root@localhost
, faça o login no mysql e execute
SELECT PASSWORD('creatorpassword');
Isso retornará uma string parecida com um MD5 de 41 caracteres.
Passo 02) Como root@localhost
, faça o login no mysql e execute
SET SQL_LOG_BIN=0;
GRANT ALL PRIVILEGES ON *.* to creator@localhost IDENTIFIED BY PASSWORD '41-character MD5-like string';
Isso cria o usuário e define sua senha. A primeira linha SET SQL_LOG_BIN=0
simplesmente impede que o comando seja gravado nos logs binários se você tiver o log binário ativado.
Passo 03) Remova os comandos do histórico de auditoria do mysql.
Toda vez que você logar no mysql, os comandos são registrados em um arquivo chamado .mysql_history
. Execute ths
cd
vi .mysql_history
Quando você entrar em vi
, execute /SELECT PASSWORD
, pressione enter. Isto irá colocá-lo na linha onde o comando para imprimir a função PASSWORD do texto foi feito. Simplesmente pressione dd
e ZZ
e está pronto.
Indo adiante, você pode criar o criador @ localhost com os mesmos direitos que root @ localhost e ocultou bem a senha. Você só precisa manter sua integridade.