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]
表示字符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
.
试试这个:
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"
我目前正在制作一个简单的安全审核脚本,它将针对配置中的每个不匹配项打印 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]
表示字符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
.
试试这个:
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"