Terminalbefehl zum Zurückgeben der Netzwerkklasse

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?

Antworten (3)

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 $IPSVariable.

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- ipconfigBefehls komplett Klasse bestimmen.

Also alle IP-Adressen beginnend mit

  •     0 - 127 gehören zur Klasse A
  • 128 - 191 gehören zur Klasse B
  • 192 - 223 gehören zur Klasse C
  • 224 - 239 gehören zur Klasse D
  • 240 - 255 gehören zur Klasse E

Ich kann das nicht als Kommentar hinzufügen, weil es zu lang ist.