Generieren Sie Netzwerkkonfigurationsdateien mit sed und bash

Generieren Sie Netzwerkkonfigurationsdateien mit sed und bash

Meine Skriptkenntnisse sind etwas eingerostet und ich suche nach einem guten Ausgangspunkt für die Erstellung eines Skripts, das Dateien erstellt (neue Dateinamen generiert) und die IP-Adresse in der Datei bearbeitet, indem es sie um +1 erhöht.

Mein Szenario sieht so aus: Wir müssen unseren Netzwerkskripten etwa 50 IP-Adressen hinzufügen, jede mit einer inkrementellen IP. Ich könnte das manuell machen, aber ich dachte, dies wäre ein guter Zeitpunkt, um meine Skriptkenntnisse zu verbessern.

Das Benennungsschema sieht folgendermaßen aus:

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

Der Inhalt dieser Dateien ist:

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

Wobei IPADDR=10.2.7.148in jeder Datei um +1 erhöht werden sollte.

Beispiel: ifcfg-eth0:2Die Datei wäre genau dieselbe, außer dass usw. wäre IPADDR.10.2.7.149

Ich bin ziemlich sicher, dass ich aufrufen sollte, sedum die IP-Adressen zu suchen und zu ersetzen.

sedDie Suche nach einer IP-Adresse könnte beispielsweise folgendermaßen erfolgen:

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

Welche Schritte sind notwendig um eine neue Datei mit dem eth0:Num +1 erhöhten Namen sowie der IP-Adresse in der Datei zu erzeugen.

Dank im Voraus!

BEARBEITEN: Lassen Sie mich klarstellen, dass die Namen der Dateien nicht die IP-Adresse enthalten sollten.

Ich muss Datei1 in Datei2 kopieren eth0:1-> eth0:2mit demselben Dateiinhalt wie oben, außer der Tatsache, dass das IPADDR=Feld in der generierten Datei um eins erhöht werden soll.

Hinweis: Der Dateiname sollte auch um +1 erhöht werden, IE.cp ifcfg-eth0:1 ifcfg-eth0:2

Antwort1

Soweit ich weiß, sedkann ich keine Berechnungen mit Zahlen durchführen, ich würde verwendenawk

$ 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

Fügen Sie dies in eine Schleife der zu ändernden Dateien ein.


Erläuterung:

  • -F'.': Verwenden Sie .einen Feldtrenner
  • $1~"IPADDR"{}: Wenn das erste Feld IPADDRein Muster enthält, führen Sie den Inhalt aus{}
  • $NF++;OFS=".": Zahl im letzten Feld erhöhen ( NFbezeichnet die Anzahl der Felder im Datensatz).
  • 1: alles drucken

Antwort2

Ich weiß nicht, ob ich Sie richtig verstanden habe. Tut das, was Sie wollen?

Schlag:

[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;

Ergebnis:

[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

Antwort3

Mit:

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

Ausgabe:

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

Sie können -ieinen Schalter hinzufügen, um die Datei zu ändernan Ort und Stelle.

verwandte Informationen