15

我正在尝试编写一个 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

以上内容来自该论坛主题,但我对如何在脚本中使用它以使其工作并没有足够的了解。它似乎所做的就是相当于cat /etc/fail2ban/jail.conf

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

抱歉,如果这属于 ServerFault,但由于它是脚本而不是服务器配置本身的复杂性,我认为这里可能更合适。

4

4 回答 4

24

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

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

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

于 2013-06-07T15:30:23.153 回答
12

如果您愿意使用外部应用程序,您可能会对使用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 的应用程序上,并转向了这种方法。只是一个建议。

问候,

于 2016-05-04T12:04:23.220 回答
3

在这种情况下,您可以考虑使用 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 的基础设施)。

于 2013-06-07T15:30:56.517 回答
1
awk '/^[ssh-iptables/ {ok=1}
     ok==1 && $0="enabled = false" {print "  enabled = true"; ok=0 ; next}
     {print $0} ' infile > tmp
     mv tmp infile
于 2013-06-07T15:30:21.177 回答