2012-03-02 16 views
26

Estoy intentando automatizar el procedimiento de creación de usuarios de MySQL. pensé en crear un archivo temporal que contiene sentencias de creación de usuario de MySQL, entonces tendría que llamarlo así:Script de creación de usuario de Mysql

mysql -u root -proot < temp

Pero estoy atascado con la sintaxis de MySQL : aquí es el contenido de mi archivo temporal:


DROP DATABASE IF EXISTS mytestdatabase; 
CREATE DATABASE mytestdatabase; 
SELECT @password:="my password"; 
DELETE FROM mysql.user WHERE Host='localhost' AND User='mytestdatabase'; 
GRANT ALL PRIVILEGES ON mytestdatabase.* TO 'mytestdatabase'@'localhost' IDENTIFIED BY PASSWORD '@password'; 
FLUSH PRIVILEGES; 

Pero la línea

GRANT ALL PRIVILEGES ON mytestdatabase.* TO 'mytestdatabase'@'localhost' IDENTIFIED BY PASSWORD '@password'; 

(hash de la contraseña debe ser un número hexadecimal de 41 dígitos)

no se interpreta como yo esperaba que fuera. Incluso si elimino comillas simples alrededor de la etiqueta @password, sigo teniendo errores (error de sintaxis)

¿Cómo puedo hacer esto?

+0

¿Cuál es el mensaje de error? –

+0

ERROR 1372 (HY000) en la línea 9: hash de contraseña debe ser un número hexadecimal de 41 dígitos – ling

Respuesta

51

Sólo para respuesta por qué ocurre el error y para mostrar la diferencia:


A) Se espera que sea un cadena de hash valor:

GRANT ALL PRIVILEGES 
    ON `mydb` . * TO 'username'@'localhost' IDENTIFIED 
BY 
PASSWORD '@password'; 

Nota el uso de la palabra clave PASSWORD!


B) espera @password a ser un de texto simple cadena de valor:

GRANT ALL PRIVILEGES 
    ON `mydb` . * TO 'username'@'localhost' IDENTIFIED 
BY 
'@password'; 

Nota del faltaPASSWORD palabra clave!


Donde "cadena de hash" es el resultado de SELECT PASSWORD('clearTextPasswd'); - ver Snowman's answer para un ejemplo.

+1

apreciar la explicación – matt

+1

Nice. Gran explicación – cbmeeks

+1

Muchas gracias – Abdel

1

intento:

GRANT ALL PRIVILEGES ON mytestdatabase.* 
     TO [email protected] IDENTIFIED BY 'PASSWORD'; 

donde contraseña es la contraseña (entre comillas).

+0

Sí, funcionaría, pero he oído que es menos seguro ya que la contraseña puede aparecer en un archivo de historial mysql en forma clara. Preferiría evitar esta solución siempre que sea posible. – ling

+0

Luego puede configurarlo como lo mostré y luego cambiarlo así: SET PASSWORD FOR mytestdatabase = PASSWORD ('PASSWORD'); – alfasin

+0

aún aparece la forma clara de la contraseña, pero tal vez porque se llama desde un archivo, no se registrará en el "historial de MySQL". Puedo tratar de obtener más información sobre cómo funciona realmente esa "historia de mysql". Gracias. – ling

10

Si no desea guardar la contraseña en texto claro, a continuación, guardarlo en formato hash -

GRANT ALL PRIVILEGES ON mytestdatabase.* TO 'mytestdatabase'@'localhost' 
    IDENTIFIED BY PASSWORD '*7560636C2922C05954FE6A2446AA00C84708B57B'; 

Donde contraseña hash es el resultado de esta consulta -

SELECT PASSWORD('my password'); 
4

Tome un vistazo a la siguiente URL y esto le ayudará a solucionar el problema:

http://linuxadministrator.pro/blog/?p=147

mysql> select password('12345'); 
+-------------------------+ 
| password('123456') | 
+-------------------------+ 
| 2ff898e158cd0311  | 
+-------------------------+ 
1 row in set (0.00 sec) 

mysql> create user test identified by password '2ff898e158cd0311'; 
Query OK, 0 rows affected (0.00 sec) 
0

abrí phpMyAdmin y fui a la pestaña usuarios, encontré el usuario que estaba tratando de conectarse con Privilegios de edición presionados, desplazándose hacia abajo a la sección Cambiar información de inicio de sesión/Copiar usuario y seleccionando Cualquier host para la opción Host, se configuró en local. Cuando hice clic en el botón Ir, generó un script similar a los que se enumeran aquí.

GRANT ALL PRIVILEGES ON * . * TO 'james'@'%' IDENTIFIED BY PASSWORD '*780E1D13F1C7713F341A117499C6D8644464C4CF' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; 
0

sombrero Bueno es que haya errores bcoz escribió el camino equivocado simplemente que haya escribió,

GRANT ALL PRIVILEGES ON *.* TO 'USER'@'localhost' IDENTIFIED BY PASSWORD '@password'; 

y la sintaxis es cierto sigue. mira aquí.

GRANT ALL PRIVILEGES ON *.* TO 'USER'@'localhost' IDENTIFIED BY '@password'; 

porque su contraseña está causando el error. debe estar como se muestra.

4

También tengo el mismo problema, se resuelve simplemente estableciendo la contraseña mediante la consulta mencionada a continuación.

SET PASSWORD FOR 'user'@'localhost' = PASSWORD('MyNewPass');

Cuestiones relacionadas