
Esto estará en un script Perl. Necesito tomar ese número e incrementarlo en uno para las nuevas IP. ¿Alguien tiene una sola línea para mí? Puede ser Bash/Perl.
editar
Dada la siguiente 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
Debería escupir 4. Teniendo en cuenta lo que me diste a continuación
$ ip addr | grep -e 'eth[0-9]:[0-9]' | cut -d: -f2
Si cambia su respuesta a esto, la aceptaré porque me ayudó a conseguirlo.
Respuesta1
ifconfig
Si entiendo lo que está pidiendo, le gustaría un comando de una línea que tomará la salida ifconfig
y devolverá el siguiente dispositivo eth:xx para usar.
Entonces, si tenemos eth0:0, eth0:1 y eth0:2 en uso, ¿el comando debería devolver 3?
Ejemplo
Un comando como este debería hacer lo que quieras.
$ if (ifconfig | grep -q "^eth"); then \
echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
else echo 0;fi
Entonces, si tenemos un dispositivo Ethernet:
$ ifconfig | grep eth
eth0:0 Link encap:Ethernet HWaddr F0:DE:F1:2F:7D:4E
Nuestro comando devolvería un 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
Si no tenemos dispositivos Ethernet, devolveremos un 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
Detalles
Vale, parece que están sucediendo muchas cosas aquí, pero es bastante sencillo.
- declaración if: inicialmente necesitamos saber si haycualquierDispositivos Ethernet, por lo que ejecutamos
ifconfig
y buscamos la salida buscando uno. Si encontramos uno, procedemos a ejecutarloifconfig
nuevamente y analizarlo. - Segundo ifconfig: aquí estamos analizando el resultado ahora. Usamos
grep
la función PCRE (-P
) para buscar las cadenas que comienzan con ethXX:. El-o
conmutador devolverá el dígito que aparece después de ethXX:. - ordenar: luego obtenemos
sort
los resultados numéricamente, en caso de que tengamos varios dispositivos ethXX:YY. - tail: devuelve el último, este será el dispositivo ethXX:YY de mayor valor.
- Luego incrementamos este número mediante
$(( $(ifconfig ...) + 1 ))
. Entonces, si ethXX:YY es 0, obtendremos0 + 1
un archivo1
. - eco: luego obtenemos
echo
los resultados del paso 5. - Si no hay ningún dispositivo eth presente en la
ifconfig
salida, devuelva 0, ya que este será el primero.
dirección IP
Si desea utilizarlo ip addr
, puede utilizar esta forma de la solución proporcionada anteriormente para hacerlo.
$ 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
Ejemplo
Usando sus datos de muestra:
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 devolvería un 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
Respuesta2
Esta no es una respuesta directa a su pregunta, sino más bien una solución alternativa.
La solución alternativa es utilizar eliproute2utilidades. ifconfig
es antiguo y poco a poco está quedando obsoleto. Es inadecuado y no es capaz de manipular completamente la pila de redes de Linux.
Por ejemplo, como sabe con ifconfig
, debe crear una interfaz de alias ( eth0:0
, eth0:1
, etc.) para cada IP que desee asignar a esa máquina. Esto es un problema ya que sólo puedes tener 255 alias de interfaz. Con el ip
comando de iproute2 puedes asignar tantas IP como quieras a una única interfaz.
Uso de ejemplo:
# 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
No necesita saber nada sobre la configuración actual de la interfaz aparte de su nombre. No es necesario calcular el siguiente número de alias de interfaz no utilizado.