Ajuda em Script processador de Tabela de Roteamento

1. Ajuda em Script processador de Tabela de Roteamento

Newton Teixeira
newtonJr.

(usa CentOS)

Enviado em 29/10/2009 - 11:21h

Olá comunidade.
Fiz um script que processa uma tabela de roteamento de um servidor.
Eis uma tabela de exemplo:

user@servidor:~/user > route -n
Tabela de Roteamento IP do Kernel
Destino Roteador MßscaraGen. Opþ§es MÚtrica Ref Uso Iface
10.114.32.154 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0
10.114.32.153 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0
152.13.49.21 192.164.34.140 255.255.255.255 UGH 2 0 0 eth0
10.114.32.26 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0
152.13.174.121 192.164.34.110 255.255.255.255 UGH 2 0 0 eth0
10.114.32.25 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0
152.13.49.25 192.164.34.110 255.255.255.255 UGH 2 0 0 eth0
152.13.102.5 192.164.34.110 255.255.255.255 UGH 3 0 0 eth0
152.13.43.14 192.164.34.110 255.255.255.255 UGH 2 0 0 eth0
152.13.93.34 192.164.34.110 255.255.255.255 UGH 4 0 0 eth0
152.13.46.5 192.164.34.110 255.255.255.255 UGH 2 0 0 eth0
152.13.54.5 192.164.34.140 255.255.255.255 UGH 2 0 0 eth0
152.13.44.1 192.164.34.140 255.255.255.255 UGH 2 0 0 eth0
152.13.49.30 192.164.34.140 255.255.255.255 UGH 4 0 0 eth0
152.13.101.0 192.164.34.110 255.255.255.252 UG 4 0 0 eth0
152.13.175.64 192.164.34.110 255.255.255.252 UG 5 0 0 eth0
152.13.43.12 192.164.34.110 255.255.255.252 UG 2 0 0 eth0
152.13.175.12 192.164.34.110 255.255.255.252 UG 6 0 0 eth0
152.13.43.28 192.164.34.110 255.255.255.252 UG 6 0 0 eth0
152.13.54.0 192.164.34.140 255.255.255.252 UG 4 0 0 eth0
152.13.54.4 192.164.34.140 255.255.255.252 UG 2 0 0 eth0
152.13.93.0 192.164.34.110 255.255.255.252 UG 4 0 0 eth0
152.13.174.120 192.164.34.110 255.255.255.252 UG 2 0 0 eth0
152.13.96.0 192.164.34.110 255.255.255.252 UG 3 0 0 eth0
152.13.46.8 192.164.34.110 255.255.255.252 UG 3 0 0 eth0
152.13.46.4 192.164.34.110 255.255.255.252 UG 2 0 0 eth0
152.13.104.4 192.164.34.110 255.255.255.252 UG 6 0 0 eth0
152.13.174.4 192.164.34.110 255.255.255.252 UG 6 0 0 eth0
152.13.104.0 192.164.34.110 255.255.255.252 UG 6 0 0 eth0
152.13.53.4 192.164.34.140 255.255.255.252 UG 2 0 0 eth0
152.13.49.20 192.164.34.140 255.255.255.252 UG 2 0 0 eth0
152.13.49.24 192.164.34.110 255.255.255.252 UG 2 0 0 eth0
152.13.103.4 192.164.34.110 255.255.255.252 UG 4 0 0 eth0
152.13.103.0 192.164.34.110 255.255.255.252 UG 5 0 0 eth0
152.13.41.24 192.164.34.110 255.255.255.252 UG 5 0 0 eth0
152.13.41.0 192.164.34.110 255.255.255.252 UG 6 0 0 eth0
152.13.95.24 192.164.34.110 255.255.255.252 UG 5 0 0 eth0
152.13.95.20 192.164.34.110 255.255.255.252 UG 4 0 0 eth0
152.13.95.4 192.164.34.110 255.255.255.252 UG 4 0 0 eth0
152.13.98.20 192.164.34.110 255.255.255.252 UG 6 0 0 eth0
152.13.1.4 192.164.34.110 255.255.255.252 UG 6 0 0 eth0
152.13.98.0 192.164.34.110 255.255.255.252 UG 4 0 0 eth0
152.13.44.0 192.164.34.140 255.255.255.252 UG 2 0 0 eth0
152.13.103.0 192.164.34.110 255.255.255.0 UG 6 0 0 eth0
172.19.104.0 192.164.34.110 255.255.255.0 UG 7 0 0 eth0
172.19.174.0 192.164.34.110 255.255.255.0 UG 4 0 0 eth0
192.168.49.0 192.164.34.140 255.255.255.0 UG 3 0 0 eth0
10.114.32.0 192.164.34.140 255.255.255.0 UG 6 0 0 eth0
172.19.103.0 192.164.34.110 255.255.255.0 UG 5 0 0 eth0
10.129.1.0 192.164.34.140 255.255.255.0 UG 5 0 0 eth0
172.20.104.0 192.164.34.110 255.255.255.0 UG 7 0 0 eth0
192.164.34.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.164.43.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
12.89.0.0 0.0.0.0 255.255.252.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 12.89.0.1 0.0.0.0 UG 0 0 0 eth1
0.0.0.0 192.164.34.180 0.0.0.0 UG 1 0 0 eth0
user@servidor:~/user >

Fiz um script que lê essa tabela e gera 02 arquivos com a lista de IPs destino e IPs dos roteadores.
Eis o script:

#!/bin/bash

route -n > tabela-roteamento.txt

touch lista-ips-destino.txt
touch lista-ips-roteadores.txt

echo "" > lista-ips-destino.txt
echo "" >lista-ips-roteadores.txt

cat tabela-roteamento.txt | while read linha; do

ipdestino=`echo $linha | awk {'print $1'}`
iproteador=`echo $linha | awk {'print $2'}`
mascara=`echo $linha | awk {'print $3'}`

echo "$ipdestino" >> lista-ips-destino.txt
echo "$iproteador" >> lista-ips-roteadores.txt

done

Preciso melhorar esse script em alguns aspectos:

1) Preciso ignorar as duas primeiras linhas; só quero IPs e mais nada. Como faz isso em shell?

2) Depois que o arquivo é formado, gostaria de classificar o arquivo pelos IPs, tipo menores primeiros e maiores no fim do arquivo. Como fazer ?

3) Preciso criar um arquivo de IPs destino no formato IP/numero de bits da mascara. Isso, porque vou ter que utilizar esse formato no comando nmap pra testar se essas máquinas estão ativas na rede.
Exemplo: 192.168.45.0/24 ou 192.168.44.11/32. Para isso precisaria converter a mascara em numero de bits, tipo 255.255.255.0 -> 24, 255.255.255.255 -> 32, etc. Como posso fazer?

4) Pela tabela acima dá pra vê que existem apenas 03 roteadores. Como posso obter uma lista de roteadores com IPs não repetidos?

1 - 192.168.43.110
2 - 192.168.43.140
3 - 10.98.0.1
4 - 192.168.43.180

5) Como ignorar os IPs "0.0.0.0" ?

Agradeço a atenção de todos e estou no aguardo on-line. Att.





  


2. Re: Ajuda em Script processador de Tabela de Roteamento

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 29/10/2009 - 13:05h

1) Preciso ignorar as duas primeiras linhas; só quero IPs e mais nada. Como faz isso em shell?

R: Não entendi... q duas linhas são essas? D qq forma, vc pode fazer com o cut ou com o grep.

2) Depois que o arquivo é formado, gostaria de classificar o arquivo pelos IPs, tipo menores primeiros e maiores no fim do arquivo. Como fazer ?

R: Vc pode classificá-los com o sort.

3) Preciso criar um arquivo de IPs destino no formato IP/numero de bits da mascara. Isso, porque vou ter que utilizar esse formato no comando nmap pra testar se essas máquinas estão ativas na rede.
Exemplo: 192.168.45.0/24 ou 192.168.44.11/32. Para isso precisaria converter a mascara em numero de bits, tipo 255.255.255.0 -> 24, 255.255.255.255 -> 32, etc. Como posso fazer?

R: Tente, no comando nmap, colocar as faixas no formato 255.255.255.0 em vez de 24. Talvez ele t passe a saída da forma q deseja.

4) Pela tabela acima dá pra vê que existem apenas 03 roteadores. Como posso obter uma lista de roteadores com IPs não repetidos?

1 - 192.168.43.110
2 - 192.168.43.140
3 - 10.98.0.1
4 - 192.168.43.180

R: Só testando, mas teria jeito colocando condições if nesses campos.

5) Como ignorar os IPs "0.0.0.0" ?

R: o grep poderia fazer isso tb.


3. Re: Ajuda em Script processador de Tabela de Roteamento

Newton Teixeira
newtonJr.

(usa CentOS)

Enviado em 29/10/2009 - 13:12h


Lembre-se que estou fazendo isso em um laço:
cat tabela-roteamento.txt | while read linha; do

ipdestino=`echo $linha | awk {'print $1'}`
iproteador=`echo $linha | awk {'print $2'}`
mascara=`echo $linha | awk {'print $3'}`

echo "$ipdestino" >> lista-ips-destino.txt
echo "$iproteador" >> lista-ips-roteadores.txt

done

então como uso o grep pra cada linha ? Podes dar um exemplo como ordeno com o sort?

As duas primeiras linha do resultado do comando route -n - que são texto e não IP

Pra pergunta 04, tem como fazer isso com vetor que cresce dianmicamente? No aguardo. Att.





4. Re: Ajuda em Script processador de Tabela de Roteamento

nelio
neliobjr

(usa Red Hat)

Enviado em 29/10/2009 - 13:33h

Ate não esta impossível, mas estou corrido, segue resposta complementando as 2 primeiras questoes:

1) sed 1,2d teste

2) sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n teste
# para consulta: só dei uma incrementada.

http://www.cyberciti.biz/faq/unix-linux-shell-script-sorting-ip-addresses/


5. Re: Ajuda em Script processador de Tabela de Roteamento

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 29/10/2009 - 13:35h

Nesse seu caso, como é linha a linha, vc pode fazer com o cut. Ele corta a linha com os campos desejados. O sort vc pode fazer depois do while pronto. Um exemplo:

# sort lista-ips-destino.txt > lista-ips-destino-organ.txt

Acho q apenas dessa forma já é o suficiente.



6. Re: Ajuda em Script processador de Tabela de Roteamento

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 29/10/2009 - 13:38h

O sed é bem mais eficiente q o cut, mas infelizmente ainda não sei mexer com ele. Caso o neliojr não tenha tempo em lhe ajudar, eu entendi mais ou menos o sed nesse tuto abaixo:

http://www.grymoire.com/Unix/Sed.html#uh-0


7. Re: Ajuda em Script processador de Tabela de Roteamento

nelio
neliobjr

(usa Red Hat)

Enviado em 29/10/2009 - 14:16h

Primeira parte, Renato só por questão de ilustração, derrepente cai numa prova, ai, o simples sort não funciona com ip, pois ele não ordena corretamente pela ordem de ip e sim por numeros, ex.:

cat lista_ip
10.114.32.154 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0
10.114.32.25 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0

#com o sort simples ele ordenou por numero, no caso o ip com final 154 vem antes de 25 pois pegou pelo 1 e não 154.
sort lista_ip

10.114.32.154 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0
10.114.32.25 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0

#agora com a sintaxe correta
sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n lista_ip

10.114.32.25 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0
10.114.32.154 192.164.34.140 255.255.255.255 UGH 6 0 0 eth0

Segunta parte, a melhor função no linux para responder este 3º problema é o awk, uma super-ferramenta, essa parte pode ser "BURRA"?, ou seja, não precisa calculas o bit da mascara, somente dizer que se for 255.255.255.0 -> 24, 255.255.255.255 -> 32, certo, se eu estiver errado tb da para fazer mas é mais complicado,

awk '$3 == "255.255.255.255" {print $1"/32"} $3 == "255.255.255.0" {print $2"/24"}' teste
# resumindo, se o campo 3 ($3), for mascara 255.255.255.255 exibe o campo 1 ($1)/32, pode ser escrito qualquer coisa. e assim continua., só acrescentar mais.

A quarta questao não entendi direito, mas com exemplo do awk vc conseguira fazer, acredito, pois ao inves de colocar a mascara vc pode colocar o ip do roteador.

e a quinta:

sed '/0.0.0.0/Id' teste
# esta opção apenas exclui da exibição

a opção -i do sed exclui definitivamente do arquivo.
sed -i '/0.0.0.0/Id' teste

vou por na conta 3 brejas. bele? rsrs brincadeira se não conseguir e/ou continuar com duvidas avisa ai...

abs


8. neliobjr

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 29/10/2009 - 14:38h

Eu havia percebido isso, depois q brinquei aki no meu computer... hauiauiahiuaha! Mas obrigado pela explicação.


9. Re: Ajuda em Script processador de Tabela de Roteamento

Newton Teixeira
newtonJr.

(usa CentOS)

Enviado em 29/10/2009 - 14:45h

Nélio, e a ficar essa parte burra, o script não vai ficar genérico.
A ideia é reutilizar em qual servidor antigo, isso porque terei que criar n condições de teste e não tenho como afirmar quais serão as mascaras em outras tabelas de outros servidores.

Muito obrigado pelas dicas, já estou incrementando as ideias de vcs. depois posto, o que estou fazendo.

Eis o que estou dizendo :

[root@srv-sl-33 NEWTON]# route -n | awk '$3 == "255.255.255.255" {print $1"/32"} $3 == "255.255.255.0" {print $2"/24"}' | wc
24 24 393
[root@srv-sl-33 NEWTON]# route -n | wc
57 454 4349
[root@srv-sl-33 NEWTON]#


Mais de 20 ips ficaram de fora porque "esqueci" de colocar um teste para outra máscara.....


10. Re: Ajuda em Script processador de Tabela de Roteamento

nelio
neliobjr

(usa Red Hat)

Enviado em 29/10/2009 - 15:38h

Newton, fazer dá, acho que quase tudo se faz em shell, mas é muito complicado.

Para calcular ip, vc tera que pegar a mascara dividir, tirar raiz, obs, o shell não faz rais direto, tera que dividir e restos, http://www.vivaolinux.com.br/topico/Sed-Awk-ER-Manipulacao-de-Textos-Strings/Raiz-quadrada-em-ShellS... , palavras do Elgio, que particularmente considero um genio, multiplicar, etc. Fiz alguns calculos e não tem mais que 20 bits do 10 255.192.0.0 ao 32 255.255.255.255, utilizaveis, pois o 127.0.0.1 volta pro host e o 0.0.0.0 elimina, usei o Ip subnet para confirmar, então é mais facil adicionar os 20 awk com os 20 ips do que fazer esse script com esse calculo.

Com o awk tb se pode efetuar calculos. ex. awk {'print $3 + 1}' teste, procure algo sobre.

Caso queira quebrar a cabeça tens agora o caminho,



11. Re: Ajuda em Script processador de Tabela de Roteamento

Newton Teixeira
newtonJr.

(usa CentOS)

Enviado em 29/10/2009 - 16:11h

Pessoal, montei um script aqui com as dicas, mas ainda não está dando certo - os arquivos gerados não estão saindo como eu quero. Dêem uma olhada pra vê o que fiz de errado, por favor. att.

Script:

#!/bin/bash

route -n > tabela-roteamento.txt

touch destinos.txt
touch roteadores.txt

echo "" > destinos.txt
echo "" > roteadores.txt

cat tabela-roteamento.txt | while read linha; do

ipdestino=`echo $linha | awk {'print $1'}`
iproteador=`echo $linha | awk {'print $2'}`
mascara=`echo $linha | awk {'print $3'}`

echo "$ipdestino $mascara" >> destinos.txt
echo "$iproteador" >> roteadores.txt

done

sed 1,3d destinos.txt
sed 1,3d roteadores.txt

sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n destinos.txt

awk '$2 == "0.0.0.0" {print $1"/0"} $2 == "255.0.0.0" {print $1"/8"} $2 == "255.255.0.0" {print $1"/16"} $2 == "255.255.255.0" {print $1"/24"} $2 == "255.255.255.252" {print $1"/30"} $2 == "255.255.255.255" {print $1"/32"}' destinos.txt

sed -i '/0.0.0.0/Id' destinos.txt

cat roteadores.txt |tr -d '[:alpha:]'|awk '{print $1}'|sort|uniq


12. Re: Ajuda em Script processador de Tabela de Roteamento

nelio
neliobjr

(usa Red Hat)

Enviado em 29/10/2009 - 16:25h

Cara, o que eu vejo de errado, talvez seja pois ensinei errado, o awk não tranforma, ele exibe, para salvar, redirecione a saida para um arquivo. >>

awk '$2 == "0.0.0.0" {print $1"/0"} $2 == "255.0.0.0" {print $1"/8"} $2 == "255.255.0.0" {print $1"/16"} $2 == "255.255.255.0" {print $1"/24"} $2 == "255.255.255.252" {print $1"/30"} $2 == "255.255.255.255" {print $1"/32"}' destinos.txt >> destino_final.txt

# ve se isto resolve, senão diga qual saida esta tendo para podermos ver aonde esta o erro.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts