Ao adicionar IPs com ifconfig eth: xx, como faço em uma linha encontrar a mais alta eth: xx

2

Isso será em um script Perl, eu preciso pegar esse número e incrementá-lo em um para os novos IPs. Alguém tem um forro para mim? Pode ser Bash / Perl.

editar

Dada a seguinte entrada.

inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4

Ele deve cuspir 4. Dado o que você me deu abaixo

$ ip addr | grep -e 'eth[0-9]:[0-9]' | cut -d: -f2

Se você mudar sua resposta, eu aceito porque me ajudou a entender isso.

    
por Arian 18.10.2013 / 01:14

2 respostas

0

ifconfig

Se eu entendi o que você está pedindo, você gostaria que um comando de uma linha pegasse a saída de ifconfig e retornasse o próximo dispositivo eth: xx a ser usado.

Portanto, se tivermos eth0: 0, eth0: 1 e eth0: 2 em uso, o comando deve retornar 3?

Exemplo

Um comando como este deve fazer o que você quer.

$ if (ifconfig | grep -q "^eth"); then \
      echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
      else echo 0;fi

Então, se tivermos um dispositivo Ethernet:

$ ifconfig | grep eth
eth0:0      Link encap:Ethernet  HWaddr F0:DE:F1:2F:7D:4E  

Nosso comando retornaria 1:

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
1

Se não tivermos dispositivos Ethernet, retornaremos 0:

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
0

Detalhes

OK, parece que há muita coisa acontecendo aqui, mas é bastante simples.

  1. if statement - inicialmente precisamos saber se há qualquer dispositivos Ethernet, portanto, executamos ifconfig e fazemos grep na saída procurando por um. Se encontrarmos um, prosseguiremos para executar ifconfig novamente e analisá-lo.
  2. 2nd ifconfig - Aqui estamos, na verdade, analisando a saída agora. Usamos o recurso PCRE de grep ( -P ) para procurar as sequências que começam com ethXX :. A opção -o retornará o dígito que ocorre após ethXX:.
  3. sort - Nós então sort os resultados numericamente, caso tenhamos vários dispositivos ethXX: YY.
  4. tail - retorna o último, este será o dispositivo ethXX: YY de maior valor.
  5. Em seguida, incrementamos esse número por meio do $(( $(ifconfig ...) + 1 )) . Portanto, se ethXX: YY for 0, obteremos 0 + 1 , resultando em 1 .
  6. echo - então, echo os resultados da etapa 5.
  7. Se não houver nenhum dispositivo eth presente na saída ifconfig , retorne 0, já que este será o primeiro.

ip addr

Se você quiser usar ip addr , poderá usar este formulário da solução fornecida acima para fazer isso.

$ if (ip addr | grep -q "eth"); then \
      echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
      else echo 0;fi

Exemplo

Usando seus dados de amostra:

inet xx.182.137.90/29 brd xxx.182.137.95 scope global eth0
inet xxx.182.137.91/24 brd xxx.182.137.255 scope global eth0:1
inet xxx.182.137.92/24 brd xxx.182.137.255 scope global secondary eth0:2
inet xxx.182.137.93/24 brd xxx.182.137.255 scope global secondary eth0:3
inet xxx.182.137.94/24 brd xxx.182.137.255 scope global secondary eth0:4

Este comando retornaria um 5:

$ if (ip addr | grep -q "eth"); then echo $(($(ip addr | grep -Po "(?<=eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
5
    
por 18.10.2013 / 05:59
0

Esta não é uma resposta direta à sua pergunta, mas mais uma solução alternativa.

A solução alternativa é usar os utilitários iproute2 . ifconfig é antigo e está sendo preterido lentamente. É inadequado e não é capaz de manipular completamente a pilha de redes Linux.

Por exemplo, como você sabe com ifconfig , você precisa criar uma interface de alias ( eth0:0 , eth0:1 , etc) para cada IP que você deseja atribuir a essa máquina. Este é um problema, pois você pode ter apenas 255 aliases de interface. Com o comando ip do iproute2, você pode atribuir quantos IPs desejar para uma única interface.

Exemplo de uso:

# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link 
       valid_lft forever preferred_lft forever

# ip addr add 10.0.0.1/24 dev enp5s0

# ip addr show dev enp5s0
2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:97:5a:4e:d5:4e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.20/24 brd 192.168.0.255 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet 10.0.0.1/24 scope global enp5s0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba97:5aff:fe4e:d54e/64 scope link 
       valid_lft forever preferred_lft forever

Você não precisa saber nada sobre a configuração atual da interface, além do nome. Não é necessário calcular o próximo número de alias da interface não usada.

    
por 18.10.2013 / 06:17

Tags