Bash脚本更新服务器上多个Drupal站点的Admin用户密码


Bash Script to Update Admin User Password for Multiple Drupal Sites on a Server spread over Multiple Versions

我有一个服务器,它运行着相当多的Drupal站点。其中一些较旧,运行Drupal 5,而另一些较新,运行Drupal 6。我们也开始实现Drupal 7。

我们的组织使用一个标准的网站管理密码,我们内部只分发给我们的员工维护这些网站。这可能是也可能不是最好的安全实践,但这是我们目前的做法。请假定这不会改变。

我们遇到的问题是,当我们有员工离职时,我们必须更改此密码,并将更改应用于我们运行的每个网站,以确保该员工不会破坏任何客户的网站。这对解雇来说更重要,但我们也会在辞职时这样做,作为最佳实践。

过去,我运行了一个基本的PHP脚本,在我们的数据库服务器上使用mysql_list_dbs来遍历每个数据库,并更改users表的pass字段,其中name = 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站点。与此同时,我还没有想出如何在drupal7网站上实现这一点。

所以我在寻找一个替代的解决方案。我真的认为我需要使用一个bash脚本,要么迭代虚拟主机从httpd.conf或使用查找或其他方式,cd到每个站点安装目录内的非常安装平台的"站点"文件夹(我们有一个相当混乱的设置*),并运行rush 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

…等等……你懂的。迁移到Aegir是有序的,但需要一段时间来清理。

您可以改进并继续编写下面的脚本…

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

[]的

费利佩。

Felipe的脚本看起来不错,我采用了它,以应对多站点的安装和催促。在我的设置中,它找到了我安装中的每个站点。请先用不那么具有破坏性的push命令试试:

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

Felipe和Nebel54都给了我很好的开局。我的工作基本上是在Nebel的基础上进行的,但仍然需要做一些修改。Nebel,我发现你的脚本有两个问题。

1)"PATH"似乎是一个保留词。当我试图把它作为一个变量时,它没有正常工作。所以我把它改成了"DPATH"

2)似乎传递-r参数给rush是不够的。当我使用它时,它告诉我需要更高的引导级别来运行我的命令。所以我必须在执行我的drush命令之前做一个CD到$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