Al agregar IP con ifconfig eth:xx, ¿cómo encuentro en una línea la eth:xx más alta?

Al agregar IP con ifconfig eth:xx, ¿cómo encuentro en una línea la eth:xx más alta?

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 ifconfigy 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.

  1. declaración if: inicialmente necesitamos saber si haycualquierDispositivos Ethernet, por lo que ejecutamos ifconfigy buscamos la salida buscando uno. Si encontramos uno, procedemos a ejecutarlo ifconfignuevamente y analizarlo.
  2. Segundo ifconfig: aquí estamos analizando el resultado ahora. Usamos grepla función PCRE ( -P) para buscar las cadenas que comienzan con ethXX:. El -oconmutador devolverá el dígito que aparece después de ethXX:.
  3. ordenar: luego obtenemos sortlos resultados numéricamente, en caso de que tengamos varios dispositivos ethXX:YY.
  4. tail: devuelve el último, este será el dispositivo ethXX:YY de mayor valor.
  5. Luego incrementamos este número mediante $(( $(ifconfig ...) + 1 )). Entonces, si ethXX:YY es 0, obtendremos 0 + 1un archivo 1.
  6. eco: luego obtenemos echolos resultados del paso 5.
  7. Si no hay ningún dispositivo eth presente en la ifconfigsalida, 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. ifconfiges 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 ipcomando 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.

información relacionada