HOw para encontrar o intervalo de endereços IP usando o comando grep

1

Eu preciso encontrar o intervalo de endereços IP do meu arquivo de lease. Eu estou tentando usar isso

menos / var / lib / dhcpd / | grep digamos que o intervalo seja de 192.23.253.2 a 192.23.253.100

qual comando funcionará para isso

    
por Pradeep Anandh 14.08.2015 / 18:35

4 respostas

3

Eu sinto que awk é uma ferramenta mais flexível para essa tarefa. O Python também poderia ser usado, mas você teria que escrever o script em vez de copiar e colar um comando no terminal. Você terá que alterar os padrões de regex, separadores de registro e separadores de campo para que eles funcionem no seu arquivo. Se você puder fornecer um exemplo do seu arquivo (com dados sensíveis removidos ou alterados), eu editarei esta resposta.

Arquivo de teste (copiado de outro exemplo de SO e ajustado):

lease 192.23.253.2 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}
lease 192.23.253.3 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}
lease 192.23.253.4 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}
lease 192.23.253.5 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
}
lease 192.23.253.6 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:01;
    uid 00:00:00:00:00:01;
    client-hostname "examle-workstation2";
}
lease 192.23.253.7 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 01:00:00:00:00:00;
}

Se você quiser o registro inteiro:

$ awk 'BEGIN{
      RS="lease"
      FS=" {+|;\n"
  }{
      n=split($1, a, ".")
      last=int(a[n])
      if( 3 <= last && last <= 6){
          print
      }
  }' testfile

O que está acontecendo nesta declaração awk :

  • Defina o valor do separador de registro: RS="lease" .
  • Defina o valor do separador de campo para procurar { precedido por um espaço ou ;\n : FS=" {+|;\n" .
  • Divida o primeiro campo em cada registro em qualquer . , armazene o array resultante em a , armazene o tamanho de a em n .
  • Armazene o último elemento de a em last .
  • Teste se last é igual ou menor que nosso mínimo (2) ou se last é igual ou maior que nosso máximo (6), se isso for verdade, imprima o registro inteiro.

Resultados:

 192.23.253.3 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}

192.23.253.4 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
    uid 00:00:00:00:00:00;
    client-hostname "examle-workstation1";
}

192.23.253.5 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:00;
}

192.23.253.6 {
    starts 6 2009/06/27 00:40:00;
    ends 6 2009/06/27 12:40:00;
    hardware ethernet 00:00:00:00:00:01;
    uid 00:00:00:00:00:01;
    client-hostname "examle-workstation2";
}

Se você deseja apenas os endereços IP:

$ awk 'BEGIN{
     RS="lease"
     FS=" {+|;\n"
  }{
      n=split($1, a, ".")
      last=int(a[n])
      if( 3 <= last && last <= 6){
          ip=gensub(/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/,"\1","", $1)
          print ip
      }
  }' testfile

O que está acontecendo nesta declaração awk :

  • Defina o valor do separador de registro: RS="lease" .
  • Defina o valor do separador de campo para procurar { precedido por um espaço ou ;\n : FS=" {+|;\n" .
  • Divida o primeiro campo em cada registro em qualquer . , armazene a matriz resultante em a , armazene o tamanho de a em n .
  • Armazene o último elemento de a em last .
  • Teste se last é igual ou menor que nosso mínimo (2) ou se last é igual ou maior que nosso máximo (6), se isso for verdade, use o método gensub para remover tudo além do endereço IP usando um padrão de expressão regular.

Resultados:

192.23.253.3
192.23.253.4
192.23.253.5
192.23.253.6
    
por 14.08.2015 / 21:02
1

Se eu estou entendendo sua pergunta corretamente, algo assim?

root@kali:/var/lib/dhcp# sed -n -e '/20:40:42/,/12:25:01/p' dhclient-ce17152e-8364-40bd-a3d9-5d916e421dc3-wlan0.lease | grep "expire" > narc.txt && cat narc.txt
  expire 5 2015/08/14 20:40:42;
  expire 6 2015/08/15 12:25:01;

Então,

root@kali:/var/lib/dhcp# sed -n -e '/<range-from-start>/,/<range-to-end>/p' <EXACT-LOCATION-AND-FILENAME> | grep "<beginning-line-entry-of-lease-file>" > <output-file> && cat <output-file>
  expire 5 2015/08/14 20:40:42;
  expire 6 2015/08/15 12:25:01;

A concessão do meu arquivo do pc se parece com isso

lease {
  interface "wlan0";
  fixed-address 192.168.254.25;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 86400;
  option routers 192.168.254.254;
  option dhcp-message-type 5;
  option dhcp-server-identifier 192.168.254.254;
  option domain-name-servers 192.168.254.254;
  option dhcp-renewal-time 43200;
  option dhcp-rebinding-time 75600;
  option broadcast-address 192.168.254.255;
  option host-name "kali";
  option domain-name "netgear.com";
  renew 5 2015/08/14 08:37:20;
  rebind 5 2015/08/14 17:40:42;
  expire 5 2015/08/14 20:40:42;
}
lease {
  interface "wlan0";
  fixed-address 192.168.254.25;
  option subnet-mask 255.255.255.0;
  option routers 192.168.254.254;
  option dhcp-lease-time 86400;
  option dhcp-message-type 5;
  option domain-name-servers 192.168.254.254;
  option dhcp-server-identifier 192.168.254.254;
  option dhcp-renewal-time 43200;
  option broadcast-address 192.168.254.255;
  option dhcp-rebinding-time 75600;
  option host-name "kali";
  option domain-name "netgear.com";
  renew 6 2015/08/15 00:05:34;
  rebind 6 2015/08/15 09:25:01;
  expire 6 2015/08/15 12:25:01;
}

Eu não acho que puxar apenas os dígitos funcionem sem precisar usar a "tag" em que eles aparecem.

    
por 14.08.2015 / 20:16
1
less /var/lib/dhcpd/ | grep 192\.23\.253\. |grep -vi 192\.23\.253\.1\s |grep -vi 192\.23\.253\.2[0-9][0-9] |grep -vi 192\.23\.253\.1[0-9][1-9] |grep -vi 192\.23\.253\.1[1-9]0 |grep -vi 192\.23\.253\.0

Apenas grep.

    
por 14.08.2015 / 20:05
0

Eu não acho que você pode obter um mínimo e máximo assim usando um grep. Você provavelmente pode fazer isso com um pequeno "programa" awk

    
por 14.08.2015 / 18:58

Tags