我目前正在制作一个简单的安全审核脚本,它会为配置中的每个不匹配打印OK / Error。 场景是下一个 - 例如,对于SSHD_Config,如果是这样的话,我会下一步:
if [ "`grep -E ^Protocol /etc/ssh/sshd_config`" == "Protocol 1" ]; then
echo "Protocol should be set to 2";
fi
问题是 - 如果某个变量与其值之间有多个空格怎么办? (协议2或PermitRootLogin否,例如); /*s
,/s
和类似的技巧没有帮助。
是否有人在bash脚本中检查SSHD Config的示例以在此处发布案例? 提前谢谢!
答案 0 :(得分:3)
grep的-E
选项将其置于扩展正则表达式模式。因此,您可以使用扩展正则表达式(^Protocol +1
表示以Protocol
开头的行,后跟1个或多个空格,然后是字符1
):
if grep -Eq '^Protocol +1' /etc/ssh/sshd_config; then
echo "Protocol should be set to 2";
fi
[yY]
表示字符y
或Y
:
if grep -Eq '^PermitEmptyPasswords +[yY][eE][sS]' /etc/ssh/sshd_config; then
echo "PermitEmptyPasswords should be set to no";
elif grep -Eq '^PermitEmptyPasswords +[nN][oO]' /etc/ssh/sshd_config; then
echo "PermitEmptyPasswords meets requirements";
fi
还有许多其他有趣的功能。注意:
sshd_config
文件中有多个匹配行的情况。-q
grep选项会禁止打印匹配的行。如果找到匹配的行,grep只退出状态为0,否则状态为1(未找到)或2(错误)。if
语句后面可以紧跟一个要执行的命令列表。如果列表的退出状态为0,则采用then
分支。在我们的例子中,列表只是grep
。答案 1 :(得分:0)
试试这个:
if [[ $(cat /etc/ssh/sshd_config | awk '/^Protocol/{print $2}') != 2 ]]; then
echo "Protocol should be set to 2"
fi
答案 2 :(得分:0)
使用grep获取协议2行。
然后删除可能包含2的协议1行,例如Protocol 2,1
最后应该排除散列。最后回应所需的字符串。
在grep中添加-i in grep for case insensitivity
grep -i "Protocol 2" /etc/ssh/sshd_config | grep -v "#"|grep -v "Protocol 1"|| echo "Protocol 2 is needed"