使用sed修改Tomcat的server.xml配置

3

我正在制作一个依赖于Tomcat7通过HTTPS的Ubuntu软件包。为了方便我们的客户,我希望软件包的安装脚本能够启用Tomcat7中的HTTPS。手动完成这个操作非常容易,在文件/etc/tomcat7/server.xml中,只需要取消注释以下代码块:

<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />
-->

我该如何在shell脚本中实现这个操作?最好是一种可以适应精确模式略微修改的方式。我认为规则大致是搜索“<Connector port="8443"”,然后删除块之前和之后的“<!--”和“-->”。
3个回答

7

考虑在您的server.xml上应用补丁。

  1. Generating a patch file:

    diff -ruN server.xml.old server.xml.new > mydiff.patch
    

    Where server.xml.old is the original file, and server.xml.new is the file as you want.

    The patch (mydiff.patch) will look like this:

    --- server.xml.old  2011-10-29 04:03:25.000000000 -0300
    +++ server.xml.new 2011-10-29 04:04:03.000000000 -0300
    @@ -1,10 +1,10 @@
     (...)
    
    - <!--
      <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                maxThreads="150" scheme="https" secure="true"
                clientAuth="false" sslProtocol="TLS" />
    - --->
    
     (...)
    
  2. Then, just apply the patch:

     patch server.xml mydiff.patch
    

    You can run the patch command with the flag -N. Thus, it will skip files that seems already patched.


谢谢。如果我尝试应用补丁,但是该补丁已经被应用了会发生什么?例如,在安装我的软件包之前,系统管理员已经启用了此连接器? - Jeroen Ooms
1
你可以使用标志“-N”运行patch。因此,它将跳过似乎已经打了补丁的文件。 - Thiago Curvelo
对于第二步,难道不应该是“patch server.xml < mydiff.patch”吗? - Ed Norris

1

diff 应该是你的首选工具。但如果原始配置文件经常更改,则 diff 可能无法在未来版本中应用你的脚本。

sed 也有读取多行的能力。你可能想看看这个示例,它也处理修改xml文档的情况。


0

或许这个能够工作:

 sed -nr '/^<!--/,/^-->/!{p;b};/^<!--/{h;d};H;/^-->/{x;/<Connector port="8443"/{s/(^<!--\s*\n|\n\s*-->)//g};p}'

这将忽略所有非注释行。将注释行保存在保留空间中,然后删除开始/结束注释定界符(如果注释包含<Connector port="8443"),接着打印注释/非注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接