Gere arquivos de configuração de rede usando sed e bash

Gere arquivos de configuração de rede usando sed e bash

Estou um pouco enferrujado com minhas habilidades de script e estou tentando encontrar um bom ponto de partida para criar um script que crie arquivos (gerando novos nomes de arquivos) e edite o endereço IP no arquivo, incrementando-o em +1

Meu cenário é assim: temos cerca de 50 endereços IP para adicionar aos nossos scripts de rede, cada um com um IP incremental. Eu poderia fazer isso manualmente, mas achei que seria um bom momento para tentar atualizar minhas habilidades de script.

O esquema de nomenclatura é assim:

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

O conteúdo desses arquivos é:

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

Onde IPADDR=10.2.7.148deve ser aumentado em +1 em cada arquivo.

Por exemplo: ifcfg-eth0:2file seria exatamente o mesmo, exceto que IPADDRseria 10.2.7.149e assim por diante.

Tenho quase certeza de que devo invocar sedpara localizar e substituir os endereços IP.

Por exemplo, a busca por um endereço IP usando sedpoderia ser realizada da seguinte forma:

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

Quais etapas precisam ser executadas para gerar um novo arquivo com o eth0:Nnome incrementado em +1, bem como o endereço IP no arquivo.

Desde já, obrigado!

EDIT: Deixe-me esclarecer que os nomes dos arquivos não devem conter o endereço IP.

Estou precisando que o arquivo1 seja copiado para o arquivo2 eth0:1-> eth0:2com o mesmo conteúdo do arquivo acima, exceto o fato de que o IPADDR=campo no arquivo gerado deve ser incrementado em um.

Nota: O nome do arquivo também deve ser incrementado em +1 IE.cp ifcfg-eth0:1 ifcfg-eth0:2

Responder1

Tanto quanto sei, sednão posso fazer cálculos em números, eu usariaawk

$ 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

Inclua isso em um loop de arquivos a serem alterados.


Explicação:

  • -F'.': use .um separador de campo
  • $1~"IPADDR"{}: se o primeiro campo contiver IPADDRpadrão, execute o que está dentro{}
  • $NF++;OFS=".": número de incremento no último campo ( NFdenota o número de campos no registro).
  • 1: imprima tudo

Responder2

Não sei se entendi direito. Isso faz o que você quer?

Bash:

[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

Responder3

Com:

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

Saída:

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

Você pode adicionar -iswitch para modificar o arquivono lugar.

informação relacionada