使用sed/awk/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-如果一行没有';t已经存在也很接近,但不能满足我的全部要求。


编辑:维护设置的配置变量在文件中的位置对我来说很重要。变量是按照特定的逻辑顺序定义的,这对人工编辑很有用。由于这个文件将来可能会手工编辑,我想维持秩序。简单地删除配置变量并将其添加到末尾的解决方案不符合我的要求。谢谢

这也可以用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命令中以执行就地替换。

您可以用此awk:替换sed

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

您可以在/etc/ssh/sshd_config.d/中添加或覆盖默认的ssh配置,而不会干扰默认的sshd_config

# Override sshd configuration
cat << EOF | sudo tee /etc/ssh/sshd_config.d/override.conf
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
EOF
# Restart sshd service
sudo systemctl restart sshd

最新更新