Скрипт Bash для обновления пароля администратора для нескольких сайтов Drupal на сервере, распределенных по нескольким версиям - PullRequest
4 голосов
/ 22 ноября 2011

У меня есть сервер, на котором работает довольно много сайтов на 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 ]

1 голос
/ 02 декабря 2011

Сценарий Фелипе выглядит хорошо, я его принял, чтобы разобраться с мультисайтовыми инсталляциями и 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
1 голос
/ 20 января 2012

Фелипе и Небель54 оба дали мне отличные старты. В итоге я работал, в основном, на Небеле, но все же пришлось внести некоторые изменения. Я обнаружил две проблемы с вашим сценарием, Небел.

1) Кажется, что "ПУТЬ" - зарезервированное слово. Когда я пытался использовать его как переменную, он не работал правильно. Поэтому я изменил его на «DPATH».

2) Кажется, что передачи параметра -r в drush недостаточно. Когда я использовал это, он сказал мне, что мне нужен более высокий уровень начальной загрузки для запуска моей команды. Поэтому перед выполнением команды drush мне пришлось записать компакт-диск в $ DPATH.

Для тестирования я сначала выполнил команду 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
1 голос
/ 28 ноября 2011

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

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

Felipe

...