SSHD 配置检查 bash 脚本

SSHD Config checking in bash script

我目前正在制作一个简单的安全审核脚本,它将针对配置中的每个不匹配项打印 OK/Error。 接下来是场景 - 例如,对于 SSHD_Config 我已经放了下一个 if case:

if [ "`grep -E ^Protocol /etc/ssh/sshd_config`" == "Protocol 1" ]; then
  echo "Protocol should be set to 2";
fi

问题是 - 如果某个变量与其值之间存在多个 space 怎么办? (例如协议 2 或 PermitRootLogin No); /*s/s 和类似的技巧没有帮助。

这里有人有在 bash 脚本中检查 SSHD 配置到 post 案例的示例吗? 提前致谢!

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.


试试这个:

if [[ $(cat /etc/ssh/sshd_config | awk '/^Protocol/{print }') != 2 ]]; then 
    echo "Protocol should be set to 2"
fi

使用 grep 获取协议 2 行。

然后删除可能包含 2 的协议 1 行,例如 Protocol 2,1

终于可以排除散列了。最后回显需要的字符串。

在 grep 中添加 -i 以不区分大小写

grep -i "Protocol 2" /etc/ssh/sshd_config | grep -v "#"|grep -v "Protocol 1"|| echo "Protocol 2 is needed"