Часто возникает ситуация, когда нужно быстро получить админский доступ к Drupal для проведения изменения, но мы не знаем пароля админа. В этой заметке в первой части рассмотрим, как можно выйти из этой ситуации, при помощи drush, т.е. мы заменим пароль админа, а потом после всех манипуляций вернем старый пароль админа на место. А во второй части - без drush.
Вариант 1
Для начала посмотрим вывод команды:
drush sqlq "SELECT name, pass FROM users WHERE uid = 1;"
Вывод будет, например, таким:
name pass admin $S$DDVoaxqGiaiWMqjIgdeTmd8ySy4B7Gp/KFRWbQJrZttsdOOSwhlo
Это означает, что имя пользователя администратора "admin", а в поле pass находится хэш его пароля. Сохраним значение хэша пароля, чтобы после наших манипуляций мы могли вернуть его на место.
Теперь устанавливаем новый пароль для пользователя admin:
drush upwd admin --password=newpassword
Теперь можно провести все необходимые изменения на сайте, так как мы знаем пароль пользователя с админским доступом.
После проведения всех изменений необходимо вернуть старый пароль на место. Сделать это можно следующей командой:
drush sqlq "update users set pass='$S$DDVoaxqGiaiWMqjIgdeTmd8ySy4B7Gp/KFRWbQJrZttsdOOSwhlo' where uid = 1;"
Добавлено
Так же можно использовать команду
drush uli
для получения одноразовой ссылки для авторизации под администратором сайта.
P.S. Спасибо пользователю kalabro за подсказку;)
Вариант 2
Сброс пароля для Drupal 6
Зайти в mysql:
mysql -uuser -ppass
Просмотреть список баз данных:
SHOW DATABASES;
Найти свою и установить её для дальнейшего использования:
USE drupal_database;
Выполнить команду, которая установит пароль “password” для пользователя с именем admin:
UPDATE users SET pass = MD5('password') WHERE name = ‘admin’;
Таким образом мы в запросе передали пароль и на “лету” выполнили его шифрование.
Сброс пароля для Drupal 7
Перейти в директорию с сайтом и выполнить команду:
./scripts/password-hash.sh new_password
В этой команде выполняется скрипт, которому параметром передается новый пароль “new_password”. Скрипт пароль шифрует с помощью алгоритма SHA512 и выдает зашифрованный пароль в виде хеша:
$S$D6kfEggLdwCHweucG1Yuriy1mHDdMvhcq4ANcomv3K3iz29NL7j2
Также хеш с новым паролем можно сгенерировать следующим образом:
Создать в корне сайта файл с расширением .php, например hash.php и поместить в него код:
<?php define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; require_once DRUPAL_ROOT . '/includes/password.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); echo user_hash_password('new_password'); die(); ?>
Где “new_password” - новый пароль
После этого перейти на адрес:
http://example.com/hash.php
Замените “example.com” на имя вашего домена
И вы получите хеш нового пароля.
По окончанию удалите файл hash.php!
Далее установим хеш с новым паролем для учетной записи, к примеру admin.
Установка нового пароля
Зайти в mysql:
mysql -uuser -ppass
Просмотреть список баз данных:
SHOW DATABASES;
Найти свою и установить её для дальнейшего использования:
USE drupal_database;
Выполнить команду, которая установит хеш с паролем для пользователя с именем admin:
UPDATE users SET pass ='$S$CTo9G7Lx28rzCfpn4WB2hUlknDKv6QTqHaf82WLbhPT2K5TzKzML' WHERE name = ‘admin’;
Вариант 3
Бывают случаи, при которых получить доступ к SSH не удается, а пароль поменять надо.
Для этих целей можно написать скрипт, который производит загрузку ядра Drupal и предоставляет доступ к функциям учетной записи. Этот пример работает только для Drupal 7.
Создать файл с расширение .php и случайным именем, например dy32h3.php в корне сайта с кодом:
<?php define('DRUPAL_ROOT', getcwd()); require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); require_once DRUPAL_ROOT . '/includes/password.inc'; if (isset($_GET['pass']) && !empty($_GET['pass'])) { $newhash = user_hash_password($_GET['pass']); } else { die('Retry with ?pass=PASSWORD set in the URL'); } $updatepass = db_update('users') ->fields(array( 'pass' => $newhash, // Uncomment the following lines to reset username and/or email address // 'name' => 'admin', // 'mail' => 'yourmail@example.com' )) ->condition('uid', '1', '=') ->execute(); print "Complete! Please delete this file immediately!"; drupal_exit(); ?>
При выполнении скрипта происходит смена пароля для учетной записи с uid 1, то есть для самой главной учетной записи.
Также помимо пароля можно поменять имя учетной записи и адрес электронной почты. Для этого уберите комментарии со строк и укажите новое имя и адрес электронной почты.:
// 'name' => 'admin', // 'mail' => 'yourmail@example.com'
Открыть браузер и перейти по адресу, замените “example.com” и “new_password” на имя вашего домена и новый пароль:
http://example.com/dy32h3.php?pass=new_password
Если скрипт выполнится успешно, то появится сообщение:
Complete! Please delete this file immediately!
По окончанию удалите файл dy32h3.php!
Как по мне, так
uli
намного удобнее. Пароль останется паролем, в логах всё красиво, старых хеш не надо хранить, SQL не надо писать :)Да, спасибо за подсказку. Отличное решение, сейчас в статью добавлю.