+ Responder ao Tópico



  1. #1

    Padrão Script shell dando erro

    Pessoal tenho esse script:
    Código :
    #!/bin/bash
    #Controle de Ping
    #==============================================================================           
    #variaveis e arquivos
    dir=/scripts
    porta_udp=$dir/udp.txt
    porta_tcp=$dir/tcp.txt
     
    IPT=/sbin/iptables
    PING=/bin/ping
    CAT=/bin/cat
    CUT=/usr/bin/cut
    HEAD=/usr/bin/head
    TAIL=/usr/bin/tail
    AWK=/usr/bin/awk
    GREP=/bin/grep
    host=XXX.XXX.X.X
    tempochecagem=600
    temporesposta=10
     
    #fecha porta UDP fixa
    fechaportaudp(){
     
    nroportas=1
     
    portas=`$CAT $porta_udp | $HEAD -n $1 | $TAIL -n 1`
    totalportas=`$CAT $porta_udp | $AWK -F ";" '{print NF}'`
     
    echo "Total de portas UDP - $totalportas" >> /tmp/debug
     
    while [ $nroportas -le $totalportas ]; do
     
    porta=`echo $portas | $CUT -d ';' -f $nroportas`
     
    echo "Fechando porta UDP - checagem $1 - $porta"
    #$IPT -A FORWARD -s 0/0 -p tcp --dport $porta -j DROP
     
    nroportas=$(($nroportas+1))
     
    done
    }
     
    #fecha porta TCP fixa
    fechaportatcp(){
     
    nroportas=1
     
    portas=`$CAT $porta_tcp | $HEAD -n $1 | $TAIL -n 1`
    totalportas=`$CAT $porta_tcp | $AWK -F ";" '{print NF}'`
     
    echo "Total de portas TCP - $totalportas" >> /tmp/debug
     
    while [ $nroportas -le $totalportas ]; do
     
    porta=`echo $portas | $CUT -d ';' -f $nroportas`
     
    echo "Fechando porta TCP - checagem $1 - $porta"
    #$IPT -A FORWARD -s 0/0 -p tcp --dport $porta -j DROP
     
    nroportas=$(($nroportas+1))
     
    done
    }
     
    #abre porta UDP fixa
    abreportaudp(){
     
    nroportas=1
     
    portas=`$CAT $porta_udp | $HEAD -n $1 | $TAIL -n 1`
    totalportas=`$CAT $porta_udp | $AWK -F ";" '{print NF}'`
     
    echo "Total de portas UDP - $totalportas" >> /tmp/debug
     
    while [ $nroportas -le $totalportas ]; do
     
    porta=`echo $portas | $CUT -d ';' -f $nroportas`
     
    echo "Abrindo porta UDP - checagem $1 - $porta"
    #$IPT -D FORWARD -s 0/0 -p tcp --dport $porta -j DROP
     
    nroportas=$(($nroportas+1))
     
    done
    }
     
    #abre porta tcp fixa
    abreportatcp(){
     
    nroportas=1
     
    portas=`$CAT $porta_tcp | $HEAD -n $1 | $TAIL -n 1`
    totalportas=`$CAT $porta_tcp | $AWK -F ";" '{print NF}'`
     
    echo "Total de portas TCP - $totalportas" >> /tmp/debug
     
    while [ $nroportas -le $totalportas ]; do
     
    porta=`echo $portas | $CUT -d ';' -f $nroportas`
     
    echo "Abrindo porta TCP - checagem $1 - $porta"
    #$IPT -D FORWARD -s 0/0 -p tcp --dport $porta -j DROP
     
    nroportas=$(($nroportas+1))
     
    done
    }
     
    #========================================================================
    #INICIO DA VERIFICACAO
     
    #maior q
     
    nrochecagem=1
    totalchecagens=3
     
    while [ $(($nrochecagem)) -le $(($totalchecagens)) ]; do
     
    echo "Executando - checagem $nrochecagem - total:$totalchecagens"
    TTL=`$PING -c 5 $host | $GREP avg | $CUT -d = -f 2 | $CUT -d \/ -f 2 | $CUT -d . -f 1`
    echo " "
    echo "veja o tempo medio desta passagem tempo medio = $TTL "
    echo " "
     
    portasC=`$CAT $porta_tcp | $HEAD -n $nrochecagem | $TAIL -n 1`
    echo "Portas da checagem $nrochecagem - $portasC"
    portaC=`echo $portasC | $CUT -d ';' -f $nrochecagem`
    echo "Porta a ser verificada checagem $nrochecagem - $portaC"
    $IPT -L | $GREP $portaC > /tmp/controle.txt
     
    if [ $(($TTL)) -gt $(($temporesposta)) ]; then
     
      echo "PING no Host $host lento"
      if [ -s /tmp/controle.txt ]; then
        #Ja estao sendo bloqueadas as portas
        echo "Portas ja Bloqueadas"
      else
        #Sem bloqueio -> bloquear
        echo "Fechando portas - checagem $nrochecagem"
        fechaportaudp $nrochecagem
        fechaportatcp $nrochecagem
      fi
     
    else
     
      if [ -s /tmp/controle.txt ]; then
        #Estao sendo bloqueadas as portas
        echo "Abrindo portas - checagem $nrochecagem"
        abreportatcp $nrochecagem
        abreportaudp $nrochecagem
      else
        #Sem bloqueio -> Deixa como esta
        echo "sem bloqueio -> deixa como esta"
      fi
     
    fi
     
    nrochecagem=$(($nrochecagem + 1))
     
    done

    e ao executar ele esta dando erro no primeiro e segundo whiles, o erro eh esse:

    Código :
    ./controle-ping.sh: line 31: [: too many arguments
    ./controle-ping.sh: line 53: [: too many arguments

    Alguem sabe o que ta errado??

    Vlw ae

  2. #2

    Padrão Script shell dando erro

    Meu truta, o problema está nessa variavel "$totalportas".
    Quando você vai cria-la, ao inves de criar apenas 1 valor, está criando mais de um (por isso diz: "too many arguments") é certo que seja erros dentro dos arquivos tcp.txt e udp.txt.

    isso pode:
    1;2;3;4;5;6;7;10....100;101;102

    isso não pode:
    1;2;3;4;5
    6;7;8;9;10
    100;101;102

    Se ficar em linhas diferentes ele vai retornar mais de um valor pois o awk vai fazer a contagem do total por linha, e por conseguencia jogar mais de um valor dentro do while, ocasionando o erro.

    8) Flwz

  3. #3

    Padrão Script shell dando erro

    Eh cara tah em 3 linhas mesmo, sabe algum jeito dele pegar na primeira passagem a primeira linha, na segunda a segunda linha, etc??

    falows

  4. #4

    Padrão Script shell dando erro

    Faz isso, troca:
    $CAT $porta_udp | $AWK -F ";" '{print NF}'
    $CAT $porta_tcp | $AWK -F ";" '{print NF}'

    por:
    $CAT $porta_udp | tr "\n" ";" | sed s/";$"/""/g | $AWK -F";" '{print NF}'
    $CAT $porta_tcp | tr "\n" ";" | sed s/";$"/""/g | $AWK -F";" '{print NF}'

    Com essa modificação ele vai deixar tudo em uma linha só, e retirar o ultimo ; (para evitar contar sempre 1 valor a mais)

  5. #5

    Padrão Script shell dando erro

    vlw ae vo testar.

    falows