更新存储在XML文件中的加密密码哈希,以与域密码更改同步

时间:2013-08-06 21:20:50

标签: bash svn maven password-encryption

有没有办法自动执行将settings.xml(由Maven使用)与域密码更改保持同步的任务?随着越来越多的开发迁移到maven,settings.xml中的repos列表也在增长,因此更新任务也在不断增长。

我们最近开始将maven与一些内部(公司)svn存储库一起使用,这些存储库使用每个开发人员的域用户ID和密码来控制其存储库访问。我们的域密码过期,必须经常更改。这意味着(经常)使用新的密码哈希更新〜/ .m2 / settings.xml。

我更喜欢使用bash或csh解决方案,它使用我系统上已经存在的简单命令。

我在这里看到了对Sonatype Nexus的引用 - 看起来可能会有所帮助,我会向我们的CM工作人员提出建议。但是,如果有的话,我很快就会采纳它并不乐观。我没有时间维护另一个工具的私人副本。

想法?

谢谢, 肯

1 个答案:

答案 0 :(得分:2)

我写了一个bash脚本,可以正常工作。它需要在〜/ .m2 / settings.xml中添加一小部分才能获得支持(见下文)。该脚本采用一个可选参数:一个正则表达式字符串,用于匹配与xml文件中的一个或多个密码哈希相关联的可选标记。我用它来表示域名,但它可以是任何东西(或者没有,因为它是可选的)。

脚本提示对新密码进行哈希处理,它会将新生成的哈希限制为纯字母数字(以避免在其他地方出现意外的shell-escapes的潜在问题),它会生成settings.xml的备份副本文件,然后它更新settings.xml中的选定哈希值。这是脚本:

#!/bin/bash
# Update instances of password-hashes in ~/.m2/settings.xml for a given password [and domain]
# Usage:  ./mvnpwd.sh  [domain-name-regex-string]

# Force domain-string to upper-case to keep things simple ...
mvnDomainNameRegexString=`echo $1 | tr '[a-z]' '[A-Z]'`

echo -n "New Password: "
read -s mvnPassword
echo

# Prefer pure alpha-numeric hash ...
mvnPasswordHash=""
while [ -z "$mvnPasswordHash" ]
do
    mvnHashMash=`mvn --encrypt-password "$mvnPassword"`
    mvnPasswordHash=`echo "$mvnHashMash" | egrep -o "\{[[:alnum:]]+\=\}"`
done

cp ~/.m2/settings.xml ~/.m2/settings.xml.old

oldPasswordHash=`egrep -o "<changingPasswordHash_*$mvnDomainNameRegexString>\{[a-zA-Z0-9]+\=\}</changingPasswordHash_*$mvnDomainNameRegexString>" ~/.m2/settings.xml | egrep -o "\{[a-zA-Z0-9]+\=\}"`
set $oldPasswordHash
for p do
    sed --in-place -e "s/$p/$mvnPasswordHash/g" ~/.m2/settings.xml
done

我在settings.xml文件的顶部附近添加了一个注释块来支持我的脚本。我正在使用类似xml的标记来识别(对于脚本)xml文件中其他地方使用的密码哈希值,并将任何[可选]域名与给定的哈希值相关联。由于所有这些都发生在注释块中,因此maven应该忽略它。这是一个示例settings.xml:

<settings>
    <!--  Info below is to aid in updating passwords that change periodically (e.g., domain password) ...
    <changingPasswordHash>{SomeHashWithoutADomainxYzZyHaShGiBbErIsHsTuFf=}</changingPasswordHash>
    <changingPasswordHash_MYDOMAIN>{SomeHashForMyDomainxYzZyHaShGiBbErIsHsTuFf=}</changingPasswordHash_MYDOMAIN>
    <changingPasswordHash_ANOTHERDOMAIN>{SomeHashForAnotherDomainxYzZyHaShGiBbErIsHsTuFf=}</changingPasswordHash_ANOTHERDOMAIN>
    -->
    <proxies>
        <proxy>
            <active>true</active>
            <protocol>http</protocol>
            <host>myProxy.rightHere.com</host>
            <port>80</port>
            <username>justMe</username>
            <password>{SomeHashWithoutADomainxYzZyHaShGiBbErIsHsTuFf=}</password>
            <nonProxyHosts>*.rightHere.com|*.whereIWork.com</nonProxyHosts>
        </proxy>
    </proxies>
    <servers>
        <server>
            <id>mySVNrepo1.rightHere.com</id>
            <username>justMe</username>
            <password>{SomeHashForMyDomainxYzZyHaShGiBbErIsHsTuFf=}</password>
        </server>
        <server>
            <id>corpSVNrepo2.whereIWork.com</id>
            <username>justMe</username>
            <password>{SomeHashForAnotherDomainxYzZyHaShGiBbErIsHsTuFf=}</password>
        </server>
        <server>
            <id>anotherSVNrepo3.notHere.com</id>
            <username>myOtherUserID</username>
            <password>{SomeHashWithoutADomainxYzZyHaShGiBbErIsHsTuFf=}</password>
        </server>
    </servers>
</settings>