使用bash更新ini文件中的var

时间:2013-06-07 15:22:52

标签: bash

我正在尝试编写一个bash脚本来配置服务器的各个方面。这里的上下文是用另一个值替换conf文件(ini格式)中变量的值。

上下文是

[ssh-iptables]

enabled = false

我只需要将false更改为true。

通常,我只需要使用sed

的简单位来执行此操作
sed -i 's/^enabled = false/enabled = true/g' /etc/fail2ban/jail.conf

enabled = false存在于多个地方。

我尝试使用awk但没有成功

awk -F ":| " -v v1="true" -v opt="enabled" '$1 == "[ssh-iptables]" && !f {f=1}f && $1 == opt{sub("=.*","= "v1);f=0}1' /etc/fail2ban/jail.conf

以上内容来自this forum thread,但我对如何在脚本中使用它以使其正常工作并不十分了解。它似乎只是等同于cat /etc/fail2ban/jail.conf

我发现其他一些脚本相当长,这并不理想,因为这会发生在大量的ini文件中,所以我希望有人可以帮我纠正上面的代码或指出我正确的方向。< / p>

如果这属于ServerFault,请道歉,但由于它是脚本而不是服务器配置本身的复杂性,我在这里可能更贴切。

4 个答案:

答案 0 :(得分:13)

假设您的格式是部分内没有方括号行(如[ssh-iptables]),我会使用上面的解决方案(使用sed),但将查询限制在该块内,如此:

sed -i '/^\[ssh-iptables\]$/,/^\[/ s/^enabled = false/enabled = true/' /etc/fail2ban/jail.conf

开头的额外部分告诉以下替换语句仅在[ssh-iptables]行和下一个以[开头的行之间运行。它使用两个用逗号分隔的正则表达式来表示边界。

答案 1 :(得分:8)

如果您愿意使用外部应用程序,您可能会对使用crudini感兴趣。

示例:

[oauth2provider]
module = SippoServiceOAuth2Provider
backend[] = none
wiface = public

; [calldirection]
; module = SippoServiceCallDirection
; backend[] = none
; wiface = internal

标准grep不会过滤注释的异常。

使用crudini进行咨询,设置和修改更容易:

$ crudini --get /myproject/config/main.ini oauth2provider wiface
public
$ crudini --get /myproject/config/main.ini calldirection wiface
Section not found: calldirection

我在一个仅限bash的应用程序上并采用了这种方法。只是一个建议。

此致

答案 2 :(得分:2)

在这种情况下,您可以考虑使用m4而不是sed。这使用变量替换,我认为保持文件可读。您的m4模板可能如下所示:

[ssh-iptables]
enabled=SSH_IPTABLES_ENABLED

现在,使用以下参数调用m4(可以从bash脚本调用):

m4 -DSSH_IPTABLES_ENABLED=true input.m4 > output.ini

或:

m4 -DSSH_IPTABLES_ENABLED=false input.m4 > output.ini

这是一种使用m4的过于简单的方法,如果你读到它,你会发现你可以做一些非常好的事情(这是最初设计autoconf / automake的基础设施)。

答案 3 :(得分:1)

awk '/^[ssh-iptables/ {ok=1}
     ok==1 && $0="enabled = false" {print "  enabled = true"; ok=0 ; next}
     {print $0} ' infile > tmp
     mv tmp infile