4

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

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

我们遇到的问题是,当我们有员工流动时,我们必须更改此密码并将更改应用于我们运行的每个站点,以确保员工无法破坏我们客户的任何站点。这对于解雇来说更为关键,但我们也将其作为最佳做法用于辞职。

过去,我运行了一个基本的 PHP 脚本,它在我们的数据库服务器上使用 mysql_list_dbs 来遍历每个数据库,并更改用户表中 name = admin 的 pass 字段。基本上:

while ($row = mysql_fetch_object(mysql_list_dbs($sql_connection))) {
  mysql_query("UPDATE users SET pass=MD5('$newpassword') WHERE name='admin'", $row->Database);
}

这工作得很好,但它有两个问题:

  1. 这是hacky,我讨厌hacky的东西。我宁愿做利用“官方方式”做事的事情
  2. Drupal 7 使用与 D5 和 D6 不同的散列系统,因此这不适用于 Drupal 7 站点。现在我必须在更新之前首先检查 pass 的现有值是否与旧密码的哈希匹配,这样我就不会意外破坏 Drupal 7 站点。与此同时,我还没有想出如何为 Drupal 7 站点实现这一点。

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

......等等......你明白了。迁移到 Aegir 是有序的,但需要一段时间才能清理干净。

4

3 回答 3

1

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

1)似乎“PATH”是一个保留字。当我尝试将其用作变量时,它无法正常工作。所以我把它改成了“DPATH”。

2)似乎将 -r 参数传递给 drush 是不够的。当我使用它时,它告诉我我需要更高的引导级别来运行我的命令。所以我必须在执行我的 drush 命令之前对 $DPATH 做一张 CD。

为了进行测试,我首先执行了 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
于 2012-01-20T15:45:04.847 回答
1

您可以在下面改进并继续编写此脚本...

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

[]的

费利佩

于 2011-11-28T18:37:43.630 回答
1

Felipe 的脚本看起来不错,我采用了它来处理多站点安装和 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
于 2011-12-02T13:57:15.543 回答