假设您在文本文件中列出了数千个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。
答案 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
。