Ich versuche, mir selbst einen primitiven Netzwerkscanner zu konstruieren, und ich verstehe, dass es mehrere Netzwerkklassen gibt und es für mein Programm notwendig geworden ist, genau zu bestimmen, mit welcher Netzwerkklasse die Workstation derzeit verbunden ist.
Ich habe einige Optionen ausprobiert, die ich für unnötig kompliziert halte, wie das Abschneiden verschiedener Befehle wie ifconfig
, aber diese Methoden sind mühsam und chaotisch.
Gibt es einen einzelnen Terminal-Befehl, der eine einfache Ausgabe wie zurückgeben kann 10.0.0.0
, wodurch die Netzwerkklasse identifiziert wird?
Du kannst so etwas versuchen:
#!/bin/bash
IPS=$(ifconfig -a | perl -nle'/(\d+\.\d+\.\d+\.\d+)/ && print $1' | sed 's/127.0.0.1//')
FIRST=$(echo "${IPS%%.*}")
case 1 in
$(($FIRST <= 127))) echo Class A ;;
$(($FIRST <= 191))) echo Class B ;;
$(($FIRST <= 223))) echo Class C ;;
$(($FIRST <= 239))) echo Class D ;;
$(($FIRST <= 255))) echo Class E ;;
*) echo Something wrong! ;;
esac
Wenn Sie nur die IP wollen, wiederholen Sie die $IPS
Variable.
Mit CIDR (Classless Inter Domain Routing) ist das alte Klassenkonzept vorbei. Stattdessen erstellen Sie Ihre Netzwerke, indem Sie die richtige Subnetzmaske und Ihr Routing festlegen. So viel zur Geschichte. :-)
Da mein Yosemite Netzmasken in ifconfig in hex ausgibt, habe ich ein Shell-Skript geschrieben, das alle ifconfig-Ausgaben analysiert und daraus das Netzwerk berechnet. Vielleicht könntest du das an deine Bedürfnisse anpassen. Eine Beispielausgabe wäre:
IP adress: 127.0.0.1 Netmask: 255.0.0.0 Network: 127.0.0.0
IP adress: 172.20.41.52 Netmask: 255.255.255.0 Network: 172.20.41.0
IP adress: 172.16.47.1 Netmask: 255.255.255.0 Network: 172.16.47.0
IP adress: 192.168.97.1 Netmask: 255.255.255.0 Network: 192.168.97.0
Hier ist das Skript; es lässt inet6-Adressen aus ifconfig weg und bezieht sich nur auf IPv4:
#!/bin/sh
IP="`ifconfig -a | fgrep 'inet ' | sed -e 's/^.*netmask:\(.*\)$/\1/g' -e 's/^.*inet\ \([^\ ]*\)\ .*$/\1/'`"
convert_hex_netmask_to_dec () {
nh=$1
nd=$(($nh % 0x100))
for i in 1 2 3
do
((nh = nh / 0x100))
nd="$((nh % 0x100)).$nd"
done
echo $nd
# See more at: http://compgroups.net/comp.unix.shell/convert-hex-to-decimal/497395#sthash.ShzT161v.dpuf
}
for ipadress in ${IP}
do
netmaskhex="`ifconfig -a | fgrep 'inet ' | grep ${ipadress} | awk '{print $4}'`"
netmaskdec="`convert_hex_netmask_to_dec ${netmaskhex}`"
IFS=. read -r i1 i2 i3 i4 <<< "${ipadress}"
IFS=. read -r m1 m2 m3 m4 <<< "${netmaskdec}"
NET="`printf \"%d.%d.%d.%d\n\" \"$((i1 & m1))\" \"$(($i2 & m2))\" \"$((i3 & m3))\" \"$((i4 & m4))\"`"
printf "IP adress:%15s Netmask:%15s Network:%15s\n" ${ipadress} ${netmaskdec} ${NET}
done
Wenn Sie nur das erste Oktett aus dem Netzwerk wollen, deaktivieren Sie einfach das letzte printf und ersetzen Sie es durch
printf "%d\n" "$((i1 & m1))"
Bitte überdenken und formulieren Sie Ihre Frage neu.
Sie mischen private IPv4-Adressräume und klassenbehaftete Netzwerke (die seit 1993 veraltet oder zumindest „altmodisch“ sind) und ziehen keine klassenlosen Netzwerke in Betracht .
Im altmodischen Konzept der Classful Networks erhält man die führenden Bits 0 (Class A), 10 (Class B), 110 (Class C), 1110 (Class D) oder 1111 (Class E) durch die Ausgabe eines richtigen or ifconfig
- ipconfig
Befehls komplett Klasse bestimmen.
Also alle IP-Adressen beginnend mit
Ich kann das nicht als Kommentar hinzufügen, weil es zu lang ist.