
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 ifconfig
e 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.
- declaração if - inicialmente precisamos saber se existequalquerDispositivos Ethernet, então executamos
ifconfig
e verificamos a saída procurando por um. Se encontrarmos um, executaremosifconfig
novamente e analisaremos. - 2º ifconfig - Aqui estamos analisando a saída agora. Usamos
grep
o recurso PCRE (-P
) para procurar as strings que começam com ethXX:. A-o
opção retornará o dígito que ocorre após ethXX:. - sort - Obtemos então
sort
os resultados numericamente, caso tenhamos vários dispositivos ethXX:YY. - tail - retorna o último, este será o dispositivo ethXX:YY de maior valor.
- Em seguida, incrementamos esse número por meio do arquivo
$(( $(ifconfig ...) + 1 ))
. Portanto, se ethXX:YY for 0, obteremos0 + 1
o resultado de a1
. - echo - temos então
echo
os resultados da etapa 5. - Se não houver nenhum dispositivo eth presente na
ifconfig
saí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:1
etc) para cada IP que deseja atribuir a essa máquina. Isso é um problema porque você só pode ter 255 aliases de interface. Com o ip
comando 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.