使用 sed/awk/grep 更改配置变量或添加它(如果它不存在)
Change a configuration variable or add it if it does not exist using sed/awk/grep
我有一个位于 /etc/ssh/sshd_config
的配置文件, 可能会也可能不会 包含设置 PermitRootLogin
.
PermitRootLogin yes
我的目标是将此值更改为我知道正确的值(不管当前值如何),或者如果当前未在文件中设置配置值,则将配置行添加到文件末尾.
换句话说,我想要一行命令行(或尽可能少的行)来执行以下操作:
如果存在以 PermitRootLogin
开头后跟 space 或制表符的行,请将整行替换为 PermitRootLogin no
。否则,将 PermitRootLogin no
行添加到文件末尾。
我想让它在命令行(Bash on Linux)上工作,所以可以使用 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
替换为 awk
:
awk '/^PermitRootLogin/ {
found=1;
sub(/^PermitRootLogin[[:blank:]]+.*$/, "PermitRootLogin no")
}
1;
END {
if (!found)
print "PermitRootLogin no"
}' file
这也可以用 sed
来完成:
通常,这些配置文件对选项的顺序没有任何硬性要求。至少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 命令以执行就地替换。
我有一个位于 /etc/ssh/sshd_config
的配置文件, 可能会也可能不会 包含设置 PermitRootLogin
.
PermitRootLogin yes
我的目标是将此值更改为我知道正确的值(不管当前值如何),或者如果当前未在文件中设置配置值,则将配置行添加到文件末尾.
换句话说,我想要一行命令行(或尽可能少的行)来执行以下操作:
如果存在以 PermitRootLogin
开头后跟 space 或制表符的行,请将整行替换为 PermitRootLogin no
。否则,将 PermitRootLogin no
行添加到文件末尾。
我想让它在命令行(Bash on Linux)上工作,所以可以使用 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
替换为 awk
:
awk '/^PermitRootLogin/ {
found=1;
sub(/^PermitRootLogin[[:blank:]]+.*$/, "PermitRootLogin no")
}
1;
END {
if (!found)
print "PermitRootLogin no"
}' file
这也可以用 sed
来完成:
通常,这些配置文件对选项的顺序没有任何硬性要求。至少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 命令以执行就地替换。