我有一个位于 /etc/ssh/sshd_config
的配置文件,它可能会也可能不会包含一个配置行,它设置了 PermitRootLogin
.
PermitRootLogin yes
我的目标是将此值更改为我知道正确的值(不管当前值如何),或者如果文件中当前未设置配置值,则将配置行添加到文件末尾。
换句话说,我想要一行命令行(或尽可能少的行)来执行以下操作:
如果存在以 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也很接近,但不能满足我的全部要求。
编辑:在文件中维护一组配置变量的位置对我来说很重要。变量按照对人工编辑有用的特定逻辑顺序定义。由于以后可能要手动编辑这个文件,所以我想保持顺序。简单地删除配置变量并添加到最后的解决方案不符合我的要求。谢谢。
最佳答案
这可以通过 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 命令以执行就地替换。
关于bash - 使用 sed/awk/grep 更改配置变量或添加它(如果它不存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29838848/