Wie finde ich beim Hinzufügen von IPs mit ifconfig eth:xx in einer Zeile die höchste eth:xx

Wie finde ich beim Hinzufügen von IPs mit ifconfig eth:xx in einer Zeile die höchste eth:xx

Dies wird in einem Perl-Skript sein. Ich muss diese Nummer erfassen und sie für die neuen IPs um eins erhöhen. Hat jemand einen Einzeiler für mich? Kann Bash/Perl sein.

bearbeiten

Gegeben: die folgende Eingabe.

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

Es sollte 4 ausspucken. Angesichts dessen, was Sie mir unten gegeben haben

$ ip addr | grep -e 'eth[0-9]:[0-9]' | cut -d: -f2

Wenn Sie Ihre Antwort darauf ändern, werde ich sie akzeptieren, da sie mir dabei geholfen hat, dies zu verstehen.

Antwort1

ifconfig

Wenn ich Ihre Frage richtig verstehe, möchten Sie einen einzeiligen Befehl, der die Ausgabe übernimmt ifconfigund das nächste zu verwendende eth:xx-Gerät zurückgibt.

Wenn wir also eth0:0, eth0:1 und eth0:2 verwenden, sollte der Befehl 3 zurückgeben?

Beispiel

Ein Befehl wie dieser sollte tun, was Sie wollen.

$ if (ifconfig | grep -q "^eth"); then \
      echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); \
      else echo 0;fi

Wenn wir also ein Ethernet-Gerät haben:

$ ifconfig | grep eth
eth0:0      Link encap:Ethernet  HWaddr F0:DE:F1:2F:7D:4E  

Unser Befehl würde eine 1 zurückgeben:

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
1

Wenn wir keine Ethernet-Geräte haben, geben wir eine 0 zurück:

$ if (ifconfig | grep -q "^eth"); then echo $(($(ifconfig | grep -Po "(?<=^eth[0-9]:)\d+" | sort -n | tail -1) + 1)); else echo 0;fi
0

Einzelheiten

OK, es scheint, als ob hier eine Menge los ist, aber es ist ziemlich unkompliziert.

  1. if-Anweisung - zunächst müssen wir wissen, ob esbeliebigEthernet-Geräte, also führen wir es aus ifconfigund durchsuchen die Ausgabe nach einem. Wenn wir eines finden, führen wir es ifconfigerneut aus und analysieren es.
  2. 2. ifconfig - Hier analysieren wir jetzt tatsächlich die Ausgabe. Wir verwenden grepdie PCRE-Funktion ( -P), um nach den Zeichenfolgen zu suchen, die mit ethXX: beginnen. Der -oSchalter gibt die Ziffer zurück, die nach ethXX: auftritt.
  3. Sortieren – Wir sortieren sortdie Ergebnisse dann numerisch, falls wir mehrere ethXX:YY-Geräte haben.
  4. tail – gibt das letzte zurück, dies ist das ethXX:YY-Gerät mit dem höchsten Wert.
  5. Wir erhöhen diese Zahl dann über $(( $(ifconfig ...) + 1 )). Wenn also ethXX:YY 0 ist, erhalten wir 0 + 1als Ergebnis ein 1.
  6. echo - wir geben dann echodie Ergebnisse aus Schritt 5 aus.
  7. Wenn in der Ausgabe kein eth-Gerät vorhanden ist ifconfig, geben Sie 0 zurück, da dies das erste ist.

IP-Adresse

Wenn Sie stattdessen Folgendes verwenden möchten, ip addrkönnen Sie hierzu diese Form der oben bereitgestellten Lösung nutzen.

$ 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

Beispiel

Verwenden Sie Ihre Beispieldaten:

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

Dieser Befehl würde eine 5 zurückgeben:

$ 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

Antwort2

Dies ist keine direkte Antwort auf Ihre Frage, sondern eher eine alternative Lösung.

Die alternative Lösung besteht in der Verwendung voniproute2utilities. ifconfigist veraltet und wird langsam veraltet. Es ist unzureichend und kann den Linux-Netzwerk-Stack nicht vollständig manipulieren.

Wie Sie beispielsweise von wissen , müssen Sie für jede IP, die Sie dieser Maschine zuweisen möchten, ifconfigeine Aliasschnittstelle (, usw.) erstellen eth0:0. Dies ist ein Problem, da Sie nur 255 Schnittstellenaliase haben können. Mit dem Befehl von iproute2 können Sie einer einzelnen Schnittstelle beliebig viele IPs zuweisen.eth0:1ip

Anwendungsbeispiel:

# 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

Sie müssen nichts über die aktuelle Konfiguration der Schnittstelle wissen, außer ihrem Namen. Sie müssen nicht die nächste unbenutzte Schnittstellenaliasnummer berechnen.

verwandte Informationen