OpenSSLのおかげで、サーバーが特定の暗号を受け入れるかどうかを検出するために、私は実際にIPアドレスに多くの接続を開始しています。私は1 000 000のサーバ( "listeIpShuffle.txt"に含まれています)でこのスクリプトを起動しています。したがって、スクリプトには2 forループが含まれています。最初のものはIPアドレスを含むファイルの各行を取得するために使用され、2つ目はOpenSSLバージョンで使用可能な各暗号をテストします。私はループのこれらの種類の並列化することが可能であることをGNU平行のドキュメントで見た巨大なデータセットのネストされたforループを含むbashスクリプトをGNU並列で並列化するにはどうすればいいですか?
:
*(for x in `cat xlist` ; do
for y in `cat ylist` ; do
do_something $x $y
done
done) | process_output*
が...このように書くことができます。
*parallel do_something {1} {2} :::: xlist ylist | process_output*
しかし、私がしようとして失敗しています私のIPアドレスを含む私のファイルは大きすぎるので、有名な "引数が多すぎます"というエラーが表示されます... この問題を処理してスクリプトを並列化するにはどうすればよいですか?
ありがとうございます!ここで
は私のスクリプトです:
#!/usr/bin/env bash
#on recupere toutes les ciphers d'openssl
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')
fichier="./serveursMail/listeIpShuffle.txt"
port=":25"
>resultDeprecatedCipher.txt
nbInconnu=0
echo Cipher list de $(openssl version).
for ligne in $(<$fichier)
do
ligneIp=$(echo $ligne | tr "|" "\n")
ip=($ligneIp)
ipPort=$ip$port
dns=$(echo $ligneIp |cut -f 2 -d ' ')
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')
for cipher in ${ciphers[@]}
do
if [[ $nbInconnu < 4 ]] ; then
echo -n Test $ligneIp " : " $cipher...
result=$(echo -n | timeout 10s openssl s_client -starttls smtp -cipher "$cipher" -connect $ipPort -servername $dns 2>&1) #pas de reponse apres dasn les 15sec => FAIL
if [[ "$result" =~ ":error:" ]] ; then
error=$(echo -n $result | cut -d':' -f6)
echo NON \($error\)
let "nbInconnu=0"
else
if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher :" ]] ; then
echo OUI
let "nbInconnu=0"
echo $ligneIp " : " $cipher >> resultDeprecatedCipher.txt
else
echo REPONSE INCONNUE
let "nbInconnu++" #incrementation
echo $nbInconnu
echo $result
fi
fi
else
let "nbInconnu=0"
break
fi
done
done