我编写了一个shell脚本,在/ etc / ssh / sshd_config中将GSSAPIAuthentication设置为no。
在我的脚本中,我有这一部分:
if [ $( grep "^GSSAPIAuthentication no$" /etc/ssh/sshd_config >/dev/null; echo $? ) -ne 0 ]; then
sed -i 's/^[#]*GSSAPIAuthentication.*$/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
fi
这样可以正常工作,但它会将所有出现的内容替换为:
#GSSAPIAuthentication no - > GSSAPIAuthentication no
#GSSAPIAuthentication yes - > GSSAPIAuthentication no
GSSAPIAuthentication yes - > GSSAPIAuthentication no
所以我有GSSAPIAuthentication no的多行。如何将此更改为只有一行GSSAPIAuthentication no?
感谢。
答案 0 :(得分:0)
我建议使用awk来执行此操作:
awk '/GSSAPIAuthentication/ { if (!seen++) print "GSSAPIAuthentication no"; next } 1' file
这将替换包含" GSSAPIAuthentication"的行的第一个实例。与期望的替代品。对于与模式匹配的后续行,!seen++
将为true,因此不会打印它们,next
会跳到下一条记录。最后的1
始终为true,因此会打印其他行。
要覆盖现有文件,请使用标准模式awk '...' /etc/ssh/sshd_config > tmp && mv tmp /etc/ssh/sshd_config
(但我确保这样做,直到您确定您对结果感到满意为止)。