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

标签 bash awk sed grep

我有一个位于 /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/

相关文章:

linux - 删除符合特定条件的行

bash - 从 Bash 脚本写入自定义日志文件

bash - 如何有效地列出正好有 `n` 行的文件?

背景颜色延伸到行尾的 Bash 提示符

sorting - 可以排序 | uniq 或排序 | awk 计算一列中的重复值?

awk - 删除找到的每一行

bash - 将 sed 与数组一起使用

linux - 编写脚本以获取用户输入并使用错误检查来测试是否输入了两个参数 : Linux

python - 从一个文件的提取内容创建文件

macos - -bash : export: `=' : not a valid identifier