首页 > 解决方案 > Bash grep, awk o sed 反向查找

问题描述

我正在创建一个脚本来查找密码中的常用模式。虽然我在托管面板中有安全策略,但由于不兼容,服务器已经过时。

test例如,在文件 words.txt 中,当我执行时,我把 word 放在那里grep -c test123 words.txt。当我寻找该模式时,我需要它来找到它,但我认为使用该命令grep它对我不起作用。

脚本:

EMAILPASS=`/root/info.sh -c usera | grep @`

for PAR in ${EMAILPASS} ; do

EMAIL=$(echo "${PAR}" | grep @ | cut -f1 -d:)
PASS=$(echo "${PAR}" | cut -d: -f 2)
PASS="${PASS,,}"
FINDSTRING=$(grep -ic "${PASS}" /root/words.txt)

echo -e ""
echo -e "Validating password ${EMAIL}"
echo -e ""


if [ $FINDSTRING -ge 1 ] ; then
echo "Insecre"
else
echo "Secure"
fi

该命令的当前输出如下

# grep -c test123 /root/words.txt
0

我认为 grep 不适合我需要的东西,也许有人可以帮助我。

我也可以使用 awk 或 sed 但我找不到帮助我的选项。

问候

标签: bashawksedgrep

解决方案


反转您的申请。

echo test123 | grep -f words.txt

文本文件的每一行都将用作测试输入的模式。

编辑

显然,您实际上确实想查看整个密码是否是一个实际单词,而不仅仅是检查它是否基于字典单词。这是相当不安全的,但很容易做到。test123除非整个密码与字典中的单词完全匹配,否则您拥有的逻辑不会报告为不安全。

您说您正在test输入字典并test123用作密码,所以我假设您正在根据字典单词查找密码,这是我上面建议的结构。将包括如下注释的备用行。

此外,既然您正在进行不区分大小写的搜索,为什么还要费心将密码小写?

declare -l pass                          # set as always lowecase

会这样做,但没有必要。

同样,除非您稍后再次使用它,否则没有必要先将所有内容放入变量中,例如grep结果。尝试删除任何不需要的东西——少即是多。

最后,由于我们没有grep在变量中捕获输出并对其进行测试,因此我将其与-q. 我们只需要看看它是否找到了任何东西,并且由 . 检查的返回码if告诉我们这一点。

/root/info.sh -c usera | grep @ |        # only lines with at signs
  while IFS="$IFS:" read email pass      # parse on read with IFS
  do printf "\n%s\n\n" "Validating password for '$email'"
     if grep -qi "$pass" /root/words.txt # exact search (-q = quiet)
    #if grep -qif /root/words.txt <<< "$pass" # 'based on' search
     then echo "Insecure"
     else echo "Secure"                  # well....
     fi
  done

我认为更好的范例可能是只报告有问题的,而对那些看起来不错的保持沉默,但这取决于你。

问题?


推荐阅读