我的配置文件位于/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也很接近但不符合我的全部要求。
编辑:在文件中维护集合配置变量的位置对我来说很重要。变量是按照对人类编辑有用的特定逻辑顺序定义的。由于此文件可能会在未来手动编辑,我想维护订单。简单地删除配置变量并将其添加到最后的解决方案不符合我的要求。感谢。
答案 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命令以执行就地替换。