Скрипт Bash для обновления пароля администратора для нескольких сайтов Drupal на сервере, распределенных по нескольким версиям
У меня есть сервер, на котором работает довольно много сайтов на Drupal. Некоторые из них более старые и работают под Drupal 5, а некоторые более новые и работают под Drupal 6. Мы также начинаем внедрять Drupal 7.
Наша организация использует один стандартный пароль для администрирования веб-сайта, который мы раздаем только нашим сотрудникам для обслуживания этих веб-сайтов. Это может или не может быть лучшей практикой безопасности, но это то, как мы делаем вещи в настоящее время. Пожалуйста, предположите, что это не изменится.
Проблема, с которой мы сталкиваемся, заключается в том, что, когда у нас происходит смена сотрудников, мы должны изменить этот пароль и применить изменение к каждому сайту, который мы запускаем, чтобы убедиться, что сотрудник не может испортить сайты наших клиентов. Это более важно для увольнений, но мы также делаем это для увольнений в качестве лучшей практики.
В прошлом я запускал базовый PHP-скрипт, который использовал mysql_list_dbs на нашем сервере баз данных, чтобы перебирать каждую базу данных и изменять поле прохода в таблице пользователей, где имя = admin. В принципе:
while ($row = mysql_fetch_object(mysql_list_dbs($sql_connection))) {
mysql_query("UPDATE users SET pass=MD5('$newpassword') WHERE name='admin'", $row->Database);
}
Это прекрасно работало, но у него есть две проблемы:
- Это хакер, и я ненавижу хакерские вещи. Я предпочел бы делать вещи, которые используют "официальный способ" делать вещи
- Drupal 7 использует другую систему хеширования, чем D5 и D6, так что это не будет работать для сайтов Drupal 7. Теперь я должен сначала проверить, что существующее значение pass соответствует хэшу старого пароля перед обновлением, чтобы я случайно не сломал сайт Drupal 7. Между тем, я еще не выяснил, как реализовать это для сайтов Drupal 7.
Поэтому я ищу альтернативное решение. Я действительно думаю, что мне нужно использовать скрипт bash, который либо проходит по виртуальным хостам из httpd.conf, либо использует find или что-то, и так или иначе, компакт-диски в каждый каталог установки сайта внутри папки "sites" самой платформы установки (у нас есть довольно грязная настройка *) и запускает drush upwd admin --password=$newpassword
Это будет полностью независимым от платформы и позволит Drupal определять, что происходит при смене пароля.
Я понимаю, что Aegir действительно может быть хорошим решением для этого, но мы еще не готовы внедрить Aegir, и я ищу более быстрое и грязное промежуточное решение. Я ценю любой ваш вклад.
* Просто пример нашей грязной установки:
/www
/cliena
/drupal-5.x
/sites
/clienta.com <-- contains settings.php for Client A
/clientb
/drupal-5.x <-- contains old code base for Drupal 5 site that's been migrated I shoudld probably have my drush/bash script ignore these sections....
/drupal-6.x <-- contains code base for current Drupal 6 site
/sites
/clientb.com <-- contains settings.php for Client B
/clientc
/drupal-6.x
/sites
/default <-- contains settings.php for clientc.com
/sub1.clientc.com <-- contains settings.php for sub1.clientc.com
/sub2.clientc.com <-- contains settings.php for sub2.clientc.com
/sub3.clientc.com <-- contains settings.php for sub3.clientc.com
/client_sites
/drupal-5.x
/sites
/clientd.com <-- contains settings.php for clientd.com
/cliente.com <-- contains settings.php for cliente.com
/clientf.com <-- contains settings.php for clientf.com
... и так далее... вы получите картину. Миграция в Эгир в порядке, но потребуется время, чтобы навести порядок.
3 ответа
Сценарий Фелипе выглядит хорошо, я принял его, чтобы иметь дело с мультисайтовыми инсталляциями и drush. В моей настройке он нашел каждый сайт в моей установке. Пожалуйста, попробуйте сначала с помощью не слишком разрушительной команды drush:
PASSWORD='secret'
for FILE in $(find /www/ -type f -name settings.php); do
PATH=`dirname $FILE`
echo "Changing password for: $PATH"
drush -r $PATH upwd admin --password=$PASSWORD
done
Фелипе и Nebel54 оба дали мне отличные старты. В итоге я работал в основном на Небеле, но все же пришлось внести некоторые изменения. Я нашел две проблемы с вашим сценарием, Небель.
1) Кажется, что "ПУТЬ" - зарезервированное слово. Когда я пытался использовать его как переменную, он не работал правильно. Поэтому я изменил его на "DPATH".
2) Кажется, что передачи параметра -r в drush недостаточно. Когда я использовал это, он сказал мне, что мне нужен более высокий уровень начальной загрузки для запуска моей команды. Поэтому мне пришлось записать компакт-диск в $DPATH перед выполнением команды drush.
Для тестирования я сначала выполнил команду sql-connect, потому что она просто выводит строку подключения sql для проверки и не вносит никаких изменений. Я собираюсь запустить обновление пароля сейчас. Вот мой последний сценарий:
PASSWORD='newpass'
for FILE in $(find /www/ -type f -name settings.php); do
DPATH=`dirname $FILE`
cd $DPATH
echo "Changing password for: $DPATH"
drush upwd admin --password=$PASSWORD
done
Вы можете улучшить и продолжить писать этот скрипт ниже...
for FILE in $(find /www -type f -name system.module); do
C_PATH=`dirname $FILE`
C_VERSION=`grep "define('VERSION'," $FILE | awk -F "'" {'print $4'}`
print "--- DEBUG --- "
print "Current path: $C_PATH"
print "Current version: $C_VERSION"
# Your logic here...
done
[] 'S
Фелипе