cd ~/

Home of Daniel Graf

Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

cd ~/

Home of Daniel Graf

Seiten

Suche

Blog Meta

Dynamo Dresden

Galerie

Action disabled: source
braindump:berechnung_der_netzwerk_und_broadcast_adresse_mittels_script_bash

Berechnung der Netzwerk und Broadcast Adresse mittels Bash

Während einer Schulung wurde mir von einem Dozenten folgendes Script gegeben, mit dem man unter Angabe der IP-Adresse und Netzwerk-Maske, die Netzwerk sowie die Broadcast Adresse errechnen kann.

#!/bin/bash
 
read -p "IP : " IP
read -p "NM : " NM
 
let NET="0x"`printf "%2.2X%2.2X%2.2X%2.2X" ${IP//./ }`"&0x"`printf "%2.2X%2.2X%2.2X%2.2X" ${NM//./ }` INVNM="0x"`printf "1%2.2X%2.2X%2.2X%2.2X" ${NM//./ }`"^0xFFFFFFFF"
 
INVNM=`printf "%8.8X\n" ${INVNM}`
let BC="0x"`printf "%2.2X%2.2X%2.2X%2.2X" ${IP//./ }`"|0x"${INVNM:1}
NET=`printf "%8.8X\n" ${NET}`
BC=`printf "%8.8X\n" ${BC}`
 
printf "NET: %d.%d.%d.%d\n" `echo "0x"${NET:0:2}" 0x"${NET:2:2}" 0x"${NET:4:2}" 0x"${NET:6:2}`
printf "BC : %d.%d.%d.%d\n" `echo "0x"${BC:0:2}" 0x"${BC:2:2}" 0x"${BC:4:2}" 0x"${BC:6:2}`

Von dem Script war ich so sehr begeistert, dass ich es unbedingt verstehen wollte (der Dozent konnte es nicht mehr ganz nachvollziehen) und es ggf. zu optimieren, aber in jedem Fall zu dokumentieren. Das kam dabei heraus:

#!/bin/bash
 
read -p "IP : " IP
read -p "NM : " NM
 
# IP und NM werden im ersten Schritt zu einem hex String geformt,
# anschliessend erfolgt ein bitwise AND (&) bei der Netzmaske. BITwise
# Operatoren werden auf BITfolgen angewandt (darum kuemmert sich let/AND).
# Bei AND werden Bitfolgen gleicher Laenge gepreuft, das Ergebnisbit ist 1
# wenn beide Bits uebereinstimmen, ansonsten ist das Ergebnisbit 0.
# 192      168      100      101      IP
# 11000000 10101000 01100100 01100101
# 255      255      255      252      NM
# 11111111 11111111 11111111 11111100
# -----------------------------------
# 11000000 10101000 01100100 01100100 <-- die letzte Stelle im Oktet
# 192      168      100      100      <-- unsere korrekte Netzadresse
# Grundsaetzlich laesst sich sagen, dass jedes IP Adresse Oktet 1:1
# uebernoemmen werden kann, wenn das dazu referenzierende Subnetzmasken
# Oktet genau 8 Bit gross ist. Dies ist darin begruendet da es bei einem
# 8 Bit Oktet (dezimal 255) keinerlei Hostanteile gibt.
# Wird ein Subnetzmasken Oktet geprueft, das nicht genau 8 Bit gross ist,
# wird durch die UND Verknuepfung die kleinste gemeinsame Bitfolge
# ermittelt, die zugleich auch die Netzwerk Adresse ist.
# Die Ausgabe (unsere Netzmaske) erfolgt schlussendlich als hex String.
HEX_IP="0x"$(printf "%2.2X%2.2X%2.2X%2.2X" ${IP//./ })
HEX_NM="0x"$(printf "%2.2X%2.2X%2.2X%2.2X" ${NM//./ })
NET="0x"$(printf "%8.8X\n" $(echo $((${HEX_IP}&${HEX_NM}))))
 
# Hier wird die NM erneut verwendet, um mittels bitewise XOR (^) ihren
# invertierten Wert zu ermitteln. Bei XOR werden 2 Bitfolgen gleicher Laenge
# miteinander verglichen. Das Ergebnisbit ist 1 wenn beide Bits sich
# unterscheiden, ansonsten ist das Ergebnisbit 0:
# 255      255      255      252      NM
# 11111111 11111111 11111111 11111100
# 255      255      255      255      0xFFFFFFFF
# -----------------------------------
# 00000000 00000000 00000000 00000011
# 0        0        0        4        <-- Anzahl Adressen im Netz
# Im Grunde genommen gelten hier die gleichen Bestimmungen wie im ersten
# Block bei AND, allerdings erhalten wir hier die umgekehrte/inversierte
# Form der Netzwerk Adresse. Der Wert wird anhand einer voll gesetzten
# Subnetz Adresse gebildet. Diese ist 32 Bit gross.
# Die Ausgabe (unsere invertierte Netzmaske) erfolgt als hex String.
# Ausserdem gibt es noch eine Besonderheit! Nach der hex Kennung wird eine 0
# eingefuegt. Die "Erklaerung" dazu befindet sich im naechsten Block.
INVNM="0x"$(printf "%8.8X\n" $(echo $((${HEX_NM}^0xFFFFFFFF))))
 
# Hier nun wird der BC anhand der IP und inversierten NM errechnet, mittels
# bitwise OR (|). BEI OR werden 2 Bitfolgen gleicher Laenge miteinander
# verglichen. Das Ergebnisbit ist 1 wenn das 1. Bit 1 ist ODER das 2. Bit 1
# ist, ansonsten ist das Ergebnisbit 0. Beide Bits koennen aber ebenso 1
# sein und das Ergebnisbit waere 1.
# 192      168      100      101      IP
# 11000000 10101000 01100100 01100101
# 0        0        0        4        INVNM
# 00000000 00000000 00000000 00000011
# -----------------------------------
# 11000000 10101000 01100100 01100111
# 192      168      100      103      <-- unsere Broadcast Adresse
# Durch das OR wird in beiden Bitfolgen das hoechstwertige Bit gesucht.
# Somit wird hier der groesste gemeinsame "Nenner" gesucht, was wiederum in
# der Broadcast Adresse resultiert.
############################################################################
HEX_BC="0x"$(printf "%2.2X%2.2X%2.2X%2.2X" ${IP//./ })
BC="0x"$(printf "%8.8X\n" $(echo $((${HEX_BC}|${INVNM}))))
 
# Und zu letzt natuerlich die Ausgabe, statt hex dann aber dec
printf "NET: %d.%d.%d.%d\n" $(echo "0x"${NET:2:2} \
                                   " 0x"${NET:4:2} \
                                   " 0x"${NET:6:2} \
                                   " 0x"${NET:8:2})
printf "BC : %d.%d.%d.%d\n" $(echo "0x"${BC:2:2} \
                                   " 0x"${BC:4:2} \
                                   " 0x"${BC:6:2} \
                                   " 0x"${BC:8:2})
braindump/berechnung_der_netzwerk_und_broadcast_adresse_mittels_script_bash.txt · Zuletzt geändert: 2016/04/15 09:09 von Daniel Graf