Genere archivos de configuración de red usando sed y bash

Genere archivos de configuración de red usando sed y bash

Estoy un poco oxidado en mis habilidades de secuencias de comandos y estoy tratando de encontrar un buen punto de partida para crear una secuencia de comandos que cree archivos (generando nuevos nombres de archivos) y edite la dirección IP en el archivo incrementándola en +1.

Mi escenario es el siguiente: tenemos alrededor de 50 direcciones IP para agregar a nuestros scripts de red, cada una con una IP incremental. Podría hacer esto a mano, sin embargo, pensé que sería un buen momento para intentar ponerme al día con mis habilidades de programación.

El esquema de nombres es el siguiente:

ifcfg-eth0:1, ifcfg-eth0:2, ifcfg-eth0:3 ...*n*

El contenido de estos archivos es:

DEVICE=eth0:1
NETMASK=255.255.255.0
IPADDR=10.2.7.148
BOOTPROTO=none
ONBOOT=yes
DNS1=10.2.53.150
PEERDNS=yes
DNS2=10.2.53.250
GATEWAY=10.2.7.1
TYPE=Ethernet
USERCTL=no
IPV6INIT=no

Donde IPADDR=10.2.7.148se debe aumentar en +1 en cada archivo.

Por ejemplo: ifcfg-eth0:2el archivo sería exactamente el mismo excepto que IPADDRsería 10.2.7.149y así sucesivamente.

Estoy bastante seguro de que debo invocar sedpara buscar y reemplazar las direcciones IP.

Por ejemplo, la búsqueda de una dirección IP sedse puede realizar así:

sed -rn '/(IPPADDR=)((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' file

Qué pasos se deben seguir para generar un nuevo archivo con el eth0:Nnombre incrementado en +1, así como la dirección IP en el archivo.

¡Gracias de antemano!

EDITAR: Permítanme aclarar que los nombres de los archivos no deben contener la dirección IP.

Necesito copiar el archivo1 al archivo2 eth0:1-> eth0:2con el mismo contenido de archivo que el anterior, excepto el hecho de que el IPADDR=campo en el archivo generado debe incrementarse en uno.

Nota: El nombre del archivo también debe incrementarse en +1 IE.cp ifcfg-eth0:1 ifcfg-eth0:2

Respuesta1

Hasta donde yo sé, sedno puedo hacer cálculos con números, usaríaawk

$ awk -F'.' '$1~"IPADDR"{$NF++;OFS="."}1' file
DEVICE=eth0:1
NETMASK=255.255.255.0
IPADDR=10.2.7.149
BOOTPROTO=none
ONBOOT=yes
DNS1=10.2.53.150
PEERDNS=yes
DNS2=10.2.53.250
GATEWAY=10.2.7.1
TYPE=Ethernet
USERCTL=no
IPV6INIT=no

Incluya esto en un bucle de archivos que se van a cambiar.


Explicación:

  • -F'.': use .un separador de campo
  • $1~"IPADDR"{}: si el primer campo contiene IPADDRun patrón, ejecute lo que hay dentro{}
  • $NF++;OFS=".": incrementa el número en el último campo ( NFindica el número de campos en el registro).
  • 1: imprime todo

Respuesta2

No sé si te he entendido bien. ¿Hace esto lo que quieres?

Intento:

[root@domain]:test # IP=120
[root@domain]:test # for i in {1..50}; do
> echo "IP=10.11.11.$IP
> NETMASK=255.255.255.0
> DEVICE=eth0:1
> ONBOOT=yes
> DNS1=10.2.53.150
> PEERDNS=yes
> DNS2=10.2.53.250
> GATEWAY=10.2.7.1
> TYPE=Ethernet
> USERCTL=no
> IPV6INIT=no" >> ifcfg-eth0:$i; IP=$((IP+1)); done;

Resultado:

[root@domain]:test # ls ifcfg* |wc -l
50
[root@domain]:test # grep IP= ifcfg*
ifcfg-eth0:1:IP=10.11.11.120
...
ifcfg-eth0:50:IP=10.11.11.169

Respuesta3

Con:

$ perl -ne '
    s/^(IPADDR=10\.2\.7\.)(\d+)/$2 < 255 and sprintf "%s%s", $1, $2 + 1/e;
    print
' file

Producción:

DEVICE=eth0:1
NETMASK=255.255.255.0
IPADDR=10.2.7.149
BOOTPROTO=none
ONBOOT=yes
DNS1=10.2.53.150
PEERDNS=yes
DNS2=10.2.53.250
GATEWAY=10.2.7.1
TYPE=Ethernet
USERCTL=no
IPV6INIT=no

Puede agregar -iun interruptor para modificar el archivo.en su lugar.

información relacionada