Je lance actuellement de nombreuses connexions à des adresses IP grâce à OpenSSL afin de détecter si un serveur accepte ou non un chiffrement spécifié. Je lance ce script sur 1 000 000 de serveurs (contenus dans "listeIpShuffle.txt"). Donc, mon script contient 2 pour la boucle: la première est utilisée pour obtenir chaque ligne de mon fichier contenant des adresses IP, et la seconde pour tester chaque chiffrement disponible dans ma version OpenSSL si le serveur l'accepte ou le rejette.Comment paralléliser un script bash contenant des boucles imbriquées sur un grand ensemble de données avec GNU parallèle?
je vis sur le doc parallèle GNU qu'il est possible de paralléliser ce genre de boucle:
*(for x in `cat xlist` ; do
for y in `cat ylist` ; do
do_something $x $y
done
done) | process_output*
... peut être écrit comme ceci:
*parallel do_something {1} {2} :::: xlist ylist | process_output*
Mais je n'essayer pour appliquer ça sur mon script ... En effet mon fichier contenant mes adresses IP est trop gros, et j'ai la fameuse erreur "Trop d'arguments" ... Comment puis-je gérer ce problème et rendre mon script parallèle?
Merci d'avance!
Voici mon script:
#!/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