2017-07-05 11 views
3

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 

答えて

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 

単一のサーバーが--shufを追加するには過負荷になりません。並列でできるだけ多くを実行するには、-j0を追加します。

関連する問題