Назад | Перейти на главную страницу

Как я могу изменить пароль пользователя MySQL, не набирая его на консоли?

Я видел различные методы установки паролей в MySQL, например:

GRANT USAGE ON db.* to 'dave'@'localhost' IDENTIFIED BY 'supersecretpassword');
SET PASSWORD [FOR 'dave'@'localhost'] = PASSWORD('reallysecretpassword');
UPDATE mysql.user SET PASSWORD=PASSWORD('confidentialpassword') WHERE user='dave' AND host='localhost';

Но они, похоже, включают ввод пароля в открытом виде как часть команды SQL, что вызывает паранойю по поводу таких вещей, как то, попадает ли он в мою историю команд SQL, или о том, смотрит ли кто-нибудь через мое плечо или может взглянуть на мою прокрутку терминала .

Могу ли я каким-либо образом заставить MySQL предлагать мне ввести пароль, не отображая его на экране (так же, как Unix с passwd)?

Алгоритм хеширования паролей довольно прост и может быть воспроизведен на других языках программирования.

В соответствии с https://www.pythian.com/blog/hashing-algorithm-in-mysql-password/, в MySQL 4.1 и выше PASSWORD функция дважды принимает (двоичный) SHA1 строки пароля, а затем возвращает его в виде шестнадцатеричной строки, перед которой стоит звездочка.

Например, в SQL:

> SELECT PASSWORD('test'), SHA1(UNHEX(SHA1('test')));
+-------------------------------------------+------------------------------------------+
| PASSWORD('test')                          | SHA1(UNHEX(SHA1('test')))                |
+-------------------------------------------+------------------------------------------+
| *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | 94bdcebe19083ce2a1f959fd02f964c7af4cfc29 |
+-------------------------------------------+------------------------------------------+

Использование кода MySQL на консоли лишает смысла, но вот довольно простой сценарий Python, который запрашивает пароль и генерирует из него строку пароля, совместимую с MySQL.

import hashlib, getpass

def mysql_password(p):
    return '*' + hashlib.sha1( hashlib.sha1(p).digest() ).hexdigest().upper()

password = getpass.getpass()

print(mysql_password(password))

Затем это можно назначить непосредственно пользователю в MySQL:

SET PASSWORD FOR 'dave'@'localhost' = '*94BDCE...';

Таким образом, в истории консоли / MySQL можно увидеть только хэш пароля. (Это не больше, чем может увидеть любой, у кого есть доступ к mysql.user стол.)

Так как Федерико Сьерра указывает в комментариях, вы можете использовать mysqladmin password команда для изменения пароля для любого пользователя, под которым вы можете войти.

Раньше пароль нужно было вводить в командной строке, но, начиная с версии 5.7, если пароль не указан, запрашивается пароль.

Из документация mysqladmin:

password Новый пароль

Установите новый пароль. Это изменяет пароль на Новый пароль для учетной записи, которую вы используете с mysqladmin для подключения к серверу. Таким образом, в следующий раз, когда вы вызовете mysqladmin (или любой другой клиентской программы), используя ту же учетную запись, вам нужно будет указать новый пароль.

[...]

В MySQL 5.7 новый пароль можно опустить после password команда. В таком случае, mysqladmin запрашивает значение пароля, что позволяет не указывать пароль в командной строке. Пропуск значения пароля следует делать только в том случае, если пароль является последней командой на mysqladmin командная строка. В противном случае в качестве пароля принимается следующий аргумент.

Итак, если вы можете войти в систему как пользователь (т.е. вы знаете пароль пользователя - и вы находитесь на хосте, с которого вам разрешено входить в систему), то вы можете изменить их пароль с помощью:

mysqladmin password -u <user_name> [-p]

например

$ mysqladmin password -u dave -p
Enter password: 
New password: 
Confirm new password: 

Конечно, если у вас есть права root, вы можете сбросить пароль пользователя (и при необходимости изменить его хост), чтобы вы могли войти в систему для этого. Но это связано с риском, поэтому это не идеально.

Сценарий-оболочка на каком-то языке (я бы использовал php и запускал через cli, поскольку это было бы быстрое копирование / вставка из того, что у меня уже есть), который выполняется, затем удаляется или, по крайней мере, снова редактируется, чтобы изменить все пароли на «changeme " или похожие.