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

1

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 acelerar 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

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

Por exemplo: O arquivo ifcfg-eth0:2 seria o mesmo, exceto que IPADDR seria 10.2.7.149 e assim por diante.

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

Por exemplo, a pesquisa de um endereço IP usando sed pode 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 tomadas para gerar um novo arquivo com o nome eth0:N incrementado por +1, bem como o endereço IP no arquivo.

Obrigado antecipadamente!

EDITAR: 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:2 com o mesmo conteúdo do arquivo acima, exceto o fato de que o campo IPADDR= 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

    
por Christopher Stanley 18.11.2014 / 21:11

3 respostas

1

Tanto quanto eu saiba que sed não pode fazer cálculos em números, eu usaria awk

$ 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 IPADDR padrão, execute o que está dentro de {}
  • $NF++;OFS="." : número de incremento no último campo ( NF indica o número de campos no registro).
  • 1 : imprima tudo
por 18.11.2014 / 21:35
1

Não sei se entendi corretamente. 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
    
por 18.11.2014 / 21:30
0

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 a opção -i para modificar o arquivo no local .

    
por 18.11.2014 / 21:19