Comando de terminal para devolver la clase de red

Estoy tratando de construirme un escáner de red primitivo, y entiendo que hay múltiples clases de red y se ha vuelto necesario que mi programa determine exactamente a qué clase de red está conectada actualmente la estación de trabajo.

He probado algunas opciones que considero innecesariamente complicadas, como truncar varios comandos como ifconfig, sin embargo, estos métodos son arduos y complicados.

¿Hay un solo comando de Terminal que pueda devolver una salida simple como 10.0.0.0, identificando así la clase de red?

Respuestas (3)

Puedes intentar algo como esto:

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

Si solo desea la IP, haga eco de la $IPSvariable.

Con CIDR (Enrutamiento entre dominios sin clase), el antiguo concepto de clase desaparece. En su lugar, crea sus redes configurando la máscara de subred adecuada y su enrutamiento. Tanto para la historia. :-)

Como mi Yosemite genera máscaras de red en ifconfig en hexadecimal, escribí un script de shell que analiza todos los resultados de ifconfig y calcula la red a partir de ellos. Tal vez podría modificar eso a sus necesidades. Una salida de muestra sería:

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


Aquí está el guión; omite las direcciones inet6 de ifconfig y se relaciona solo con 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


Si solo desea el primer octeto de la red, simplemente deshabilite la impresión final y reemplácela con

printf "%d\n" "$((i1 & m1))"

Por favor reconsidere y reformule su pregunta.

Está mezclando espacios de direcciones IPv4 privados y redes con clase (que están obsoletas o al menos "anticuadas" desde 1993) y no considera redes sin clase .

En el concepto anticuado de redes con clase , los bits principales 0 (Clase A), 10 (Clase B), 110 (Clase C), 1110 (Clase D) o 1111 (Clase E) se obtienen al emitir un comando correcto o ifconfigcompleto . determinar la clase.ipconfig

Entonces, todas las direcciones IP que comienzan con

  •     0 - 127 pertenecen a la Clase A
  • 128 - 191 pertenecen a la Clase B
  • 192 - 223 pertenecen a la Clase C
  • 224 - 239 pertenecen a la Clase D
  • 240 - 255 pertenecen a la Clase E

No puedo agregar esto como un comentario porque es demasiado largo.