Eu quero verificar se a entrada do usuário é um endereço IP/CIDR válido no bash e estou usando expressões regulares para fazer isso. Portanto, o CIDR válido deve ser 0-32 e para IP de (1-254).(1-255).(1-255).(1-255)/(1-32)
Então meu código atualmente é:
read -p "Input: " ip_address
if [[ $ip_address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$ ]];
then
echo "VALID"
else
echo "NOT VALID"
fi
Mas é muito generoso e aceita algumas combinações não válidas. Portanto, uma combinação válida de endereço IP/CIDR deve ser: 10.11.11.11/24
ou 254.255.255.255/23
e inválida será 256.19.11.11/24
porque o primeiro octeto é maior que 255 ou 222.222.222.222/33
aqui o CIDR é maior que 32. Existe outra maneira além do regex para verificar o endereço IP/CIDR válido?
Para lidar adequadamente com a validação de um endereço IP ou CIDR, use uma função de biblioteca criada especificamente para isso, como a
cidrvalidate()
função Perl noNet::CIDR
módulo:Veja
perldoc Net::CIDR
o que mais esta biblioteca pode fazer.Os
--
não são necessários nos exemplos acima, mas seriam para entrada arbitrária do usuário, caso contrário, essa entrada seria tomada como uma opçãoperl
se começasse com-
.As abordagens abaixo são variações de sua tentativa, que não se importa com máscaras de rede inválidas.
Um inteiro decimal positivo entre 0 e 255 pode ser correspondido por
Um inteiro decimal positivo entre 0 e 32 pode ser correspondido por
Usando isso:
A expressão
expandiria para a expressão regular completa para um CIDR válido abrangendo todo o comprimento da string fornecida.
A outra maneira óbvia de fazer isso é ler os números na string fornecida e testar se os quatro primeiros estão no intervalo de 0 a 255 e se o quinto está no intervalo de 0 a 32:
Aqui lemos cinco palavras em cinco variáveis. A string inserida é dividida em palavras
.
e/
quando lida (o que significa que3/3/3/3.2
seria analisado como válido, mas veja$ipaddr
no código). Qualquer leitura de dados não inteiros acionaria a saída do script. Em seguida, começamos a testar seus valores em relação aos intervalos válidos. Se algum teste falhar, o endereço inserido não é válido.