更改配置变量或使用sed / awk / grep添加配置变量(如果不存在)

时间:2015-04-24 04:40:22

标签: bash awk sed grep

我的配置文件位于/etc/ssh/sshd_config 可能<或不 包含设置PermitRootLogin的配置行。

PermitRootLogin yes

我的目标是将此值更改为我知道正确的值(无论当前值如何),或者如果文件中当前未设置配置值,则将配置行添加到文件末尾。< / p>

换句话说,我想要一个命令行单行(或尽可能少的行)来执行以下操作:

如果存在以PermitRootLogin开头,后跟空格或制表符的行,请将整行替换为PermitRootLogin no。否则,请将行PermitRootLogin no添加到文件末尾。

我希望这可以在命令行上运行(Linux上的Bash),因此可以使用sed,awk和grep。

我知道我可以用

完成我的一半要求(如果它存在,替换它)
sed -i 's/^PermitRootLogin[ \t].*$/PermitRootLogin no/' /etc/ssh/sshd_config

如果可以修改此项以在没有匹配时添加该行,那么这对我有用。

sed,awk.grep - add a line to the end of a configuration section if the line doesn't already exist也很接近但不符合我的全部要求。

编辑:在文件中维护集合配置变量的位置对我来说很重要。变量是按照对人类编辑有用的特定逻辑顺序定义的。由于此文件可能会在未来手动编辑,我想维护订单。简单地删除配置变量并将其添加到最后的解决方案不符合我的要求。感谢。

2 个答案:

答案 0 :(得分:1)

您可以将此sed替换为awk

awk '/^PermitRootLogin/ {
   found=1;
   sub(/^PermitRootLogin[[:blank:]]+.*$/, "PermitRootLogin no")
}
1; 
END {
   if (!found)
      print "PermitRootLogin no"
}' file

答案 1 :(得分:1)

这也可以通过sed来完成:

通常,这些conf文件对选项序列没有任何硬性要求。至少sshd_config没有这样的要求。

因此,这个sed应该可以正常工作:

sed '/PermitRootLogin/d; ${p;s/.*/PermitRootLogin yes/}' /etc/ssh/sshd_config

如果要保留文件中的行位置,请使用以下命令。

sed '1{p;s/.*/PermitRootLogin yes/;h;d;};/^PermitRootLogin/{g;p;s/.*//;h;d;};$G' /etc/ssh/sshd_config

在您对输出感到满意后,将-i标志添加到sed命令以执行就地替换。