SSHD配置检查bash脚本

时间:2017-08-08 08:27:30

标签: bash security ssh redhat openssh

我目前正在制作一个简单的安全审核脚本,它会为配置中的每个不匹配打印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的示例以在此处发布案例? 提前谢谢!

3 个答案:

答案 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]表示字符yY

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"