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