+ Responder ao Tópico



  1. #1

    Padrão Shell Script pegandos dados errados (em um enlace for)

    Pessoal,

    Estou passando por um problema realmente estranho. Vejam a linha que eu tenho em um script shell:

    for i in `cat /etc/firewall/qos/prio0.ips | awk '{print $2}'`
    do
    echo "/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src $i"
    done
    Esse comando é apenas um teste para eu ver como é executado o comando pois estava dando um erro em um script (que rodava perfeitamente bem no Fedora Core3 e no CentOS 4.4, mas agora no CentOS 5 deu esse problema). Vejam o que ele retorna:

    [root@ns1 qos]# ./teste.sh
    /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 201.12.38.23
    /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 201.11.53.10
    Até aqui tudo excelente e a linha está perfeita. Agora eu preciso completar o comando, que seria assim:

    for i in `cat /etc/firewall/qos/prio0.ips | awk '{print $2}'`
    do
    echo "/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src $i flowid 1:10"
    done
    Agora vejam o que a execução desse script me retorna:

    [root@ns1 qos]# ./teste.sh
    flowid 1:10ter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 201.12.38.23
    flowid 1:10ter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 201.11.53.10
    Sinceramente não sei como isso acontece, mas ele manda o flowid para a frente do comando sem mais nem menos... Alguém pode me ajudar?

    DADOS:
    Linux CentOS v5.5
    Kernel 2.6.22

  2. #2

    Padrão

    tente fazer assim

    for i in `cat /etc/firewall/qos/prio0.ips | awk '{print $2}'`
    do
    echo "/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src $i flowid 1\:10"
    done


    Veja se funciona....

  3. #3

    Padrão

    Gray,

    O problema é que o awk não está pegando somente o IP, mas o "newline" (\n) também, você tem que remover o "newline" da variável $i antes de mandar para o comando.

    Não sou muito bom de shell script, então não sei como faria para remover isso no shell script, se fosse em PERL era bem mais facil, mas fica ai a dica, mais tarde eu vejo como se faz e posto aqui.

  4. #4

    Padrão

    Citação Postado originalmente por GrayFox Ver Post
    tente fazer assim

    for i in `cat /etc/firewall/qos/prio0.ips | awk '{print $2}'`
    do
    echo "/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src $i flowid 1\:10"
    done


    Veja se funciona....
    Caro GrayFox,

    Não deu certo. Não é esse o problema. Além do que se eu deixar apenas o "flowid" depois do $i já existe o problema.

    Citação Postado originalmente por rmaximo Ver Post
    Gray,

    O problema é que o awk não está pegando somente o IP, mas o "newline" (\n) também, você tem que remover o "newline" da variável $i antes de mandar para o comando.

    Não sou muito bom de shell script, então não sei como faria para remover isso no shell script, se fosse em PERL era bem mais facil, mas fica ai a dica, mais tarde eu vejo como se faz e posto aqui.
    Caro rmaximo,

    Também não resolveu. Na verdade não é o \n que está atrapalhando senão apresentaria o problema a partir da segunda linha e no meu caso são em todas. Mudei o estilo do arquivo e usei um cut (cut -d \; -f 2) e deu no mesmo problema. Tirei o coment do arquivo e deixei apenas o IP (apenas um item por linha) e não usei nem cut nem awk e deu na mesma... Veja abaixo:

    Código :
    [root@ns1 qos]# cat teste.sh
    #!/bin/bash
     
    for i in `cat /etc/firewall/qos/prio0.ips`
    do
            echo "/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src $i flowid 1\:10"
    done
    [root@ns1 qos]# ./teste.sh
     flowid 1\:10er add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 201.12.38.23
     flowid 1\:10er add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 201.11.53.10
     flowid 1\:10er add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 69.0.145.157
     flowid 1\:10er add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 74.52.168.210
     flowid 1\:10er add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 69.0.145.136
     flowid 1\:10er add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip src 69.0.145.138

    O conteúdo do arquivo prio0.ips (com todos os caracteres de fim de linha e afins):

    Código :
    [root@ns1 qos]# cat -A prio0.ips
    201.12.38.23^M$
    201.11.53.10^M$
    69.0.145.157^M$
    74.52.168.210^M$
    69.0.145.136^M$
    69.0.145.138^M$

  5. #5

    Padrão

    DESCOBRI!

    Pessoal, perdão pelo meu erro. Levei horas de trabalho para entender o que havia ocorrido.

    Todos os arquivos foram colocados em backup em um arquivo .tar.gz e foram vizualidos em uma máquina Windows. Nessa vizualização foi inserido aquele "^M$" no final dos arquivos e por isso o sistema não entendia mais nada... Foi bobeira minha. Vejam como o mesmo arquivo fica em modo unix:

    Código :
    [root@ns1 qos]# cat -A prio0.ips
    201.12.38.23$
    201.11.53.10$
    69.0.145.157$
    74.52.168.210$
    69.0.145.136$
    69.0.145.138$

    Claro que se não fosse pela ajuda do fórum eu nunca iria procurar os caracteres de final de linha... obrigado a todos!

    PS.: O comando que usei, caso queiram saber, é o dos2unix.