繁体   English   中英

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

[英]How to write an output of a grep from an openssl command?

假设您在文本文件中有上千个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。

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

#!/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

如果您有一些失败,我可以对其进行测试。

如果您尝试获取哪个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM