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?
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 $IPS
variable.
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 ifconfig
completo . determinar la clase.ipconfig
Entonces, todas las direcciones IP que comienzan con
No puedo agregar esto como un comentario porque es demasiado largo.