Bash 脚本 - 如果案例 $? > 0

Bash scripting - if cases $? > 0

对于可能出现的垃圾邮件,我深表歉意,我正在完成 RHEL 安全 Hardening/Auditing 脚本,最后我想要一个总体结果。 例如,

# PermitEmptyPasswords
grep -E '^\s*PermitEmptyPasswords\s+no\s*' /etc/ssh/sshd_config &> /dev/null
if [ $? = 0 ];
then echo "[ OK ] PermitEmptyPasswords is properly configured";
else echo "[ ERROR ] PermitEmptyPasswords is not properly configured";
fi

现在,我对总体结果(Safe/Not 安全)的想法是对所有这些求和 if $?情况下,如果所有情况的总和为 0,它将回显 "This system is properly configured by hardening policy",否则回显 "This system has errors" + 重新打印所有错误,其中 $? > 0.

如何获得这项工作?我是编写脚本的新手,所以任何帮助都将不胜感激。 提前致谢。

您可以做的是:

创建一个空变量并为其赋值 0

count=0

每当退出状态大于 0 时,将其递增 1。示例:

if [[ $? -gt 0 ]]; then ((count++)); fi

要在最后打印出来,你可以做一个简单的数组,但我认为只需将内容附加到文件中,然后在最后读取就足够了。

if [[ $? -gt 0 ]]; then ((count++)) && echo "whatever" >>filename; fi

最后,只需 cat 文件名并显示错误数,只需回显计数变量:

echo "Count number: $count"

P.S 如果您使用 bash 作为 shell,请使用双括号和右括号。

@py9 已经回答了这个问题,但我想指出一点:在测试命令是否成功时,直接使用命令作为 if 条件更简单并且更健壮一些,而不是使用 $? 来检查其退出状态。此外,您可以使用 grep -q(安静模式),而不是将 grep 的输出重定向到 /dev/null。最后(正如@CharlesDuffy 指出的那样),grep -E 理解扩展的正则表达式语法,它不包括 \s(这是 PCRE 的一部分——perl 兼容的正则表达式——语法)。所以使用这样的东西:

if grep -q -E '^[[:space:]]*PermitEmptyPasswords[[:space:]]+no[[:space:]]*' /etc/ssh/sshd_config; then
    echo "[ OK ] PermitEmptyPasswords is properly configured"
else
    echo "[ ERROR ] PermitEmptyPasswords is not properly configured"
    ((count++))
fi