如何从openssl命令编写grep的输出?

时间:2017-06-05 22:22:20

标签: bash grep echo

假设您在文本文件中列出了数千个IP地址 - 每行一个。我希望能够使用openssl s_client命令从每个IP地址中获取所有可能的异常。到目前为止,异常证书已过期,自签名证书和颁发者 CN 包含emailAddress=root@localhost.localdomain。

总的来说,我希望能够获得每个IP地址的简明错误消息(如果有的话)。我当前的bash脚本如下所示:

for ip in `awk '{print $1}' < general_certs.txt`; do 
# Print IP address currently checking
echo -e $ip;
    if timeout 30 openssl s_client -connect $ip:443| grep -i 'error' ; then
# Write error information and IP address to a file
        echo `openssl s_client -connect $ip:443| grep -i 'error'` $ip >> general_errors;
    else
# Write noerror information and IP address to another file
        echo "noerror" $ip >> general_noerror;
    fi;
done

我对代码的第一个问题是它没有进行优化,如果它返回准确的结果我会持怀疑态度。上述脚本的最终目标是识别包含IP的所有不受信任的证书。

第二个问题我使用上面的代码,我无法首先回应$ ip,因为它会被消息本身截断。所以,我最后在错误消息后写出了$ ip。

如果我的问题有更真实的解决方案,则没有必要使用openssl。

2 个答案:

答案 0 :(得分:0)

您可以尝试通过将进程置于后台来一次性运行它们:

#!/bin/bash
max=100
counter=0
for ip in `awk '{print $1}' < general_certs.txt`; do 
    (( counter++ ))
    (
        results=$( timeout 30 openssl s_client -connect $ip:443 2> /dev/null )
        if [ "$results" = "" ]; then
            echo "$ip noresponse"
        else 
            echo -n "$ip "
            echo "$results" | grep -i 'error' || echo "noerror"
        fi
    )  >> general_errors &
    if [ $counter -eq $max ]; then
        wait
        counter=0
    fi
done
wait

这是输入:

$ cat general_certs.txt 
stackoverflow.com
redhat.com
google.com
8.8.8.8
vt.edu
bls.gov
8.8.4.4

这是输出:

$ cat general_errors
8.8.4.4 noerror
stackoverflow.com noerror
google.com noerror
vt.edu noerror
bls.gov noerror
redhat.com noerror
8.8.8.8 noresponse

如果你有一些失败,我可以测试它们。

答案 1 :(得分:0)

如果您正在尝试获取哪个IP有不受信任的证书,您可以使用curl尝试,即使它不是最佳选择。

类似的东西:

for ip in `awk '{print $1}' < general_certs.txt`; do 
  echo -e $ip                                                                                                                                                     

  curl https://${ip}:443 &> /dev/null                                                                                                                             

  if [ $? == 51 ]; then                                                             
    echo "upsis, https://${ip}:443 has a untrusted certificate" >> general_err
  else                                                                              
    echo "yai, https://${ip}:443 doesn't have a untrusted certificate" >> general_noerr
  fi
done

请注意,此处您只检查不受信任的证书(curl中的错误51),但该命令可能会发送任何其他错误,并且会转到general_noerror