Terminale per restituire la classe di rete

1

Sto cercando di costruirmi uno scanner di rete primitivo, e capisco che ci sono più classi di rete ed è diventato necessario per il mio programma determinare esattamente quale classe di rete è attualmente collegata alla workstation.

Ho provato alcune opzioni che considero inutilmente complicate, come il troncamento di vari comandi come ifconfig , tuttavia questi metodi sono ardui e disordinati.

Esiste un singolo comando Terminale che può restituire un output semplice come 10.0.0.0 , identificando così la classe di rete?

    
posta user4493605 18.11.2015 - 09:03
fonte

3 risposte

2

Puoi provare qualcosa del genere:

#!/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

Se vuoi solo l'IP, riprendi la variabile $IPS .

    
risposta data 18.11.2015 - 10:16
fonte
2

Con CIDR (Classless Inter Domain Routing) il vecchio concetto di classe è sparito. Invece crei le tue reti impostando la subnet mask corretta e il tuo routing. Così tanto per la storia. :-)

Mentre il mio Yosemite emette netmasks in ifconfig in hex, ho scritto uno script di shell che analizza tutto l'output di ifconfig e calcola la rete da esso. Forse potresti modificarlo in base alle tue esigenze. Un esempio di output sarebbe:

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

Ecco la sceneggiatura; omette gli indirizzi inet6 da ifconfig e si riferisce solo a IPv4:

#!/bin/sh

IP="'ifconfig -a | fgrep 'inet ' | sed -e 's/^.*netmask:\(.*\)$//g' -e 's/^.*inet\ \([^\ ]*\)\ .*$//''"

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


Se vuoi solo il primo ottetto dalla rete, basta disabilitare la stampa finale e sostituirla con

printf "%d\n" "$((i1 & m1))"
    
risposta data 18.11.2015 - 14:16
fonte
2

Riconsidera e riformula la tua domanda.

Stai mescolando spazi di indirizzi IPv4 privati e reti classiche (che sono deprecate o almeno "antiquate" dal 1993) e non si considera < a href="https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing"> reti classless .

Nel vecchio concetto di reti classful i bit iniziali 0 (Classe A), 10 (Classe B), 110 (Classe C), 1110 (Classe D) o 1111 (Classe E ) ottieni emettendo un comando ifconfig corretto o ipconfig completamente determina la classe.

Quindi tutti gli indirizzi IP iniziano con

  • 0 - 127 appartengono alla Classe A
  • 128 - 191 appartengono alla classe B
  • 192 - 223 appartengono alla classe C
  • 224 - 239 appartengono alla classe D
  • 240 - 255 appartengono alla classe E

Non posso aggiungere questo come commento perché è troppo lungo.

    
risposta data 18.11.2015 - 09:47
fonte

Leggi altre domande sui tag