2017-07-05 1 views
3

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 

Répondre

1
echo alt3.gmail-smtp-in.l.google.com > serverlist 
echo fo-ds-ats.member.g02.yahoodns.net >> serverlist 

doit() { 
    ip="$1" 
    port="$2" 
    cipher="$3" 
    openssl s_client -starttls smtp -cipher "$cipher" -connect $ip:$port -servername $ip < /dev/null 
} 
export -f doit 
parallel --tag --timeout 10 --retries 4 doit $1 :::: serverlist ::: 25 ::: $(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g') >tmp_results 
# Post process tmp_results as needed 

Pour ne pas surcharger un seul serveur ajouter --shuf. Pour en exécuter autant que possible en parallèle, ajoutez -j0.