我正在尝试编写一个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,请道歉,但由于它是脚本而不是服务器配置本身的复杂性,我在这里可能更贴切。
答案 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