Login
Newsletter
Werbung

Do, 16. März 2017, 15:00

Shellskripte mit Aha-Effekt: Zahlenspiele

Netzwerk-Rechenfunktionen

Die folgenden Netzwerk-Rechenfunktionen stützen sich auf diese Bit-Operationen und auf die oben definierten Funktionen zur Konvertierung zwischen Dotted Quad und Integerzahl. Die öfters auftauchende Konstante 0xffffffff stellt eine Binärzahl mit 32 1-Bits dar. Alle drei Funktionen haben einen String als Eingabeparameter, der eine IP-Adresse in CIDR-Notation enthält (a.b.c.d/n). Auch verzichten die Funktionen aus Gründen der Übersichtlichkeit auf die Überprüfung der Korrektheit des Eingabeparameters.

Die erste der folgenden drei Funktionen ermittelt die Netzmaske aus dem Eingabeparameter. Hier ist die Angabe der IP-Adresse nicht nötig, sondern nur die Angabe der Netzmasken-Bits. Damit aber alle drei Funktionen mit einem einheitlichen Parameterformat versorgt werden, übergibt das Listing auch hier die IP-Adresse.

Die Funktion fischt sich in Zeile 03 mittels cut den benötigten Teil heraus. Da die Netzmaske für den Netzwerkanteil der IP-Adresse lauter 1-Bits und für den Host-Anteil lauter 0-Bits enthält, schiebt Zeile 04 einfach eine 32-Bit-Zahl aus lauter 1-Bits um die entsprechende Anzahl von Host-Bits nach links. Dabei werden automatisch 0-Bits von rechts nachgeschoben. Die oben definierte Funktion Dec2IP() erzeugt Zeile 05 dann aus der Maske das Dotted Quad:

01: NETMASK() # IP-Addr/Netmask
02:   {
03:   MASK=$(echo $1 | cut -d'/' -f2)
04:   MASK=$((0xffffffff << (32 - $MASK)))
05:   Dec2IP $MASK
06:   }

Auf ähnliche Art ermittelt man die Netzwerkadresse. Hier ist auch die IP-Adresse nötig, die man aus dem Parameter per cut abtrennt und mittels IP2Dec vom Dotted Quad zu einer 32-Bit-Integerzahl konvertiert (Zeilen 03 und 04). Danach berechnet die Funktion die Netzmaske wie schon in der vorhergehenden Funktion (Zeilen 05 und 06). Zeile 07 UND-verknüpft die IP-Adresse mit der Netzmaske, was in der Folge alle Bits des Host-Anteils der IP-Adresse auf 0 setzt. Das Ergebnis erscheint ebenfalls dank Zeile 07 auch wieder als Dotted Quad:

01 NETWORK() # IP-Addr/Netmask
02   {
03   ADDR=$(echo $1 | cut -d'/' -f1)
04   ADDR=$(IP2Dec $ADDR)
05   MASK=$(echo $1 | cut -d'/' -f2)
06   MASK=$((0xffffffff << (32 - $MASK)))
07   Dec2IP $(($ADDR & $MASK))
08   }

Die folgende, dritte Funktion schließlich berechnet die Broadcast-Adresse. Auch sie extrahiert, wie oben beschrieben, die Adresse und die Netzmaske aus den Parametern (Zeilen 03 bis 06). Um die Broadcast-Adresse zu erhalten, muss man dann die IP-Adresse mit der invertierten Netzmaske ODER-verknüpfen. Zeile 06 invertiert die Netzmaske korrekt, wobei hier die weiter oben geschilderte Komplementdarstellung zu berücksichtigen ist. Zeile 08 erledigt die ODER-Verknüpfung und es gibt das Ergebnis als Dotted Quad zurück:

01 BROADCAST() # IP-Addr/Netmask
02   {
03   ADDR=$(echo $1 | cut -d'/' -f1)
04   ADDR=$(IP2Dec $ADDR)
05   MASK=$(echo $1 | cut -d'/' -f2)
06   MASK=$((0xffffffff << (32 - $MASK)))
07   MASK=$((~$MASK & 0xffffffff))
08   Dec2IP $(($ADDR | $MASK))
09   }

Das folgende Protokoll demonstriert die drei Funktionen:

S=$(NETMASK '192.168.3.44/24')
echo $S
255.255.255.0
S=$(NETWORK '192.168.3.44/24')
echo $S
192.168.3.0
S=$(BROADCAST '192.168.3.44/24')
echo $S
192.168.3.255

Nun steht dem Generieren von ip-, ifconfig- oder route-Kommandos sowie dem Erzeugen einer interfaces-Datei per Shellskript nichts mehr im Wege.

Autoreninformation

Jürgen Plate ist Professor für Elektro- und Informationstechnik an der Hochschule für angewandte Wissenschaften München. Er beschäftigt sich seit 1980 mit Datenfernübertragung und war, bevor der Internetanschluss für Privatpersonen möglich wurde, in der Mailboxszene aktiv. Unter anderem hat er eine der ersten öffentlichen Mailboxen - TEDAS der mc-Redaktion - programmiert und 1984 in Betrieb genommen.

Dieser Artikel ist zuerst erschienen in UpTimes, Mitgliederzeitschrift des GUUG e.V., Ausgabe 2016-2. Veröffentlichung mit freundlicher Genehmigung.

  • Das Werk darf vervielfältigt, verbreitet und öffentlich zugänglich gemacht werden, Abwandlungen und Bearbeitungen des Werkes müssen unter den gleichen Bedingungen weitergegeben werden. Der Name des Autors/Rechteinhabers muss in der von ihm festgelegten Weise genannt werden.

    - Weitere Informationen
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung