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

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

Isso estará em um script Perl. Preciso pegar esse número e incrementá-lo em um para os novos IPs. Alguém tem uma frase 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

Deveria 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, aceitarei porque me ajudou a conseguir isso.

Responder1

ifconfig

Se entendi o que você está pedindo, você gostaria de um comando de uma linha que pegaria a saída ifconfige retornaria o próximo dispositivo eth:xx a ser usado.

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

Exemplo

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

$ 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. declaração if - inicialmente precisamos saber se existequalquerDispositivos Ethernet, então executamos ifconfige verificamos a saída procurando por um. Se encontrarmos um, executaremos ifconfignovamente e analisaremos.
  2. 2º ifconfig - Aqui estamos analisando a saída agora. Usamos grepo recurso PCRE ( -P) para procurar as strings que começam com ethXX:. A -oopção retornará o dígito que ocorre após ethXX:.
  3. sort - Obtemos então sortos 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 arquivo $(( $(ifconfig ...) + 1 )). Portanto, se ethXX:YY for 0, obteremos 0 + 1o resultado de a 1.
  6. echo - temos então echoos resultados da etapa 5.
  7. Se não houver nenhum dispositivo eth presente na ifconfigsaída, retorne 0, pois este será o primeiro.

endereço IP

Se desejar ip addr, você pode 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

Responder2

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

A solução alternativa é usar oiproute2Serviços de utilidade pública. ifconfigé antigo e está sendo lentamente obsoleto. É inadequado e não é capaz de manipular totalmente a pilha de rede do Linux.

Por exemplo, como você sabe ifconfig, você deve criar uma interface de alias ( eth0:0,, eth0:1etc) para cada IP que deseja atribuir a essa máquina. Isso é um problema porque você só pode ter 255 aliases de interface. Com o ipcomando do iproute2 você pode atribuir quantos IPs quiser a 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 de interface não utilizado.

informação relacionada