2012-03-02 2 views
26

Я пытаюсь автоматизировать процедуру создания пользователей MySQL. Я думал о создании временного файла, который будет содержать MySQL заявления создания пользователя, то я бы называть это так:Сценарий создания пользователя Mysql

MySQL -u корень -proot < темп

Но я застрял с синтаксисом тузд : вот содержание моего временного файла:


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; 

Но линия

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

(хэш пароля должна быть 41-значный шестнадцатеричный номер)

не интерпретируется, как я бы ожидать, что это будет. Даже если я удаляю одиночные кавычки вокруг тега @password, у меня все еще есть ошибки (синтаксическая ошибка)

Как это сделать?

+0

Какое сообщение об ошибке? –

+0

ERROR 1372 (HY000) в строке 9: Хэш пароля должен быть 41-значным шестнадцатеричным числом – ling

ответ

51

Просто ответ почему возникла ошибка и показать разницу:


A) Ожидает @password быть хэш-строка значение:

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

Обратите внимание на использование ключевого слова PASSWORD!


B) Ожидает @password быть открытым текстом строки значение: с

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

Обратите внимание на отсутствуетPASSWORD ключевое слово!


Где "хэш строки" является результатом SELECT PASSWORD('clearTextPasswd'); - см Snowman's answer для примера.

+1

оцените объяснение – matt

+1

Nice. Отличное объяснение. – cbmeeks

+1

Большое спасибо – Abdel

1

попробовать:

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

где ПАРОЛЬ Ваш пароль (в кавычках).

+0

Да, это сработает, но я слышал, что он менее безопасен, поскольку пароль может отображаться в файле истории mysql в ясной форме. Я бы предпочел избежать этого решения, когда это возможно. – ling

+0

Затем вы можете установить его, как я показал, а затем изменить его следующим образом: SET PASSWORD FOR mytestdatabase = PASSWORD ('PASSWORD'); – alfasin

+0

четкая форма пароля по-прежнему появляется, но, возможно, потому, что она вызывается из файла, она не войдет в журнал «mysql history». Я могу попытаться получить больше информации о том, как эта «история mysql» действительно работает. Спасибо. – ling

10

Если вы не хотите хранить пароль в открытом виде, а затем сохранить его в формате хэшированном -

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

Где хэшируются пароль является результатом этого запроса -

SELECT PASSWORD('my password'); 
4

Взгляните на следующий адрес, и это поможет вам решить проблему:

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

Я открыл PhpMyAdmin и пошел на вкладку пользователей, найденный пользователь я был попытавшись соединиться с нажатием «Правка привилегий», прокрутите вниз до раздела «Изменить информацию о пользователе/​​Копировать пользователя» и выберите . Любой хост для параметра «Хост» был установлен на локальный. Когда я нажал кнопку Go, он создал скрипт, похожий на те, которые перечислены здесь.

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

Ну шляпа ошибка bcoz вы написали неправильный путь только вы написали,

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

и истинный синтаксис следующим образом. Смотри сюда.

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

потому что ваш пароль вызывает эту ошибку. он должен быть указан как показано.

4

У меня также была такая же проблема, она решена, просто установив пароль по указанному ниже запросу.

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

Смежные вопросы