Скрипт 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);
}

Это прекрасно работало, но у него есть две проблемы:

  1. Это хакер, и я ненавижу хакерские вещи. Я предпочел бы делать вещи, которые используют "официальный способ" делать вещи
  2. 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

Фелипе

Другие вопросы по тегам