¿Cómo obtener la máscara de red de bash?

8

Quiero obtener mi máscara de red en Linux. Se emite con ifconfigpero quiero extraer la cadena.

michelemarcon
fuente
55
Esta pregunta es difícil, en realidad, si no especifica su sistema operativo, por ejemplo, ifconfigla línea de máscara de red de FreeBSD es: inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255así que si bien las respuestas se pueden ajustar fácilmente, probablemente no haya una talla única para todos (usando solo Bash / ifconfig) .
Sr_

Respuestas:

8

Debo aclarar que el código aquí funciona para Linux, (tenga en cuenta los comentarios y publicaciones sobre otros Unices). OP solicitó una solución de Linux, pero sería bueno cambiar la pregunta a "cómo obtener máscara de red" en general, y hacer que la respuesta combine la mejor manera para obtener más sabores de Unix.

#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'

./script eth0

Acerca de ifconfig en Linux

Junto con otros comandos de red tradicionales como netstat, arp, rarp y route, ifconfig es parte del paquete net-tools . Net-tools no se ha desarrollado activamente desde hace mucho tiempo y hay esfuerzos para desaprobarlo a favor del nuevo paquete iproute2 . En aras de la brevedad, si desea más detalles sobre esta transición fundamental, aquí hay algunos enlaces relevantes:

Ejemplo de caso: Debian Linux

Ejemplo de caso: Arch Linux

Página de manual para ifconfig de net-tools (consulte la sección ERRORES)

Análisis y comparación de los marcos desde la perspectiva de los usuarios.

ata
fuente
Si la interfaz en cuestión no tiene máscara de red, esta solución devuelve '1'. La expresión regular necesita una revisión seria para que sea confiable / segura, incluida la necesidad de un ancla adecuada en la palabra muy importante 'Máscara'.
Oliver Dungey
7
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '

?

symcbean
fuente
Te estas perdiendo | corte -c6- para eliminar también la "Máscara:"
michelemarcon
3
Especificar el separador de campo awk también funciona para eliminar "Máscara:":/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane
En Debian Stretch / net-tools 2.10-alpha tuve que cambiar esto:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane
7

Me pregunto si realmente solo quieres la máscara. Tal vez realmente desee que la red (o IP) con máscara, se use en archivos de configuración, con nmapo lo que sea.

En ese caso, en Linux, también puede analizar la salida del ip ...comando.

Para enumerar todas las interfaces con su dirección y máscara en notación CIDR:

ip -o -f inet addr show | awk '/scope global/ {print $2, $4}'

O para restringirlo a la interfaz predeterminada:

default_if=$(ip route list | awk '/^default/ {print $5}')
ip -o -f inet addr show $default_if | awk '{print $4}'

que me da "192.168.1.61/24" en mi máquina.

mivk
fuente
2
... no es realmente necesario hacer coincidir en 'alcance global' o 'predeterminado', ya que puede hacerlo ip -o -f inet addr show scope globaly ip route list default.
bryn
3

Si está utilizando un sistema operativo que genera la máscara en hexadecimal, puede hacer algo como:

#!/usr/bin/bash

# read the mask, and strip leading 0x if it's there
hexmask=$( echo $1 | sed -e 's/^0x//' )

# loop through $hexmask in pairs
#
for (( i=0; i<${#hexmask}; i+=2 )); do
        if (( $i > 1 )); then
                # use a . to separate octets
                # but don't print a leading .
                printf "%s" "."
        fi
        printf "%d" "0x${1:$i:2}"
done

printf "\n"
Tim Kennedy
fuente
2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
ztank1013
fuente
Esta es la mejor respuesta hasta ahora, ya que el resto depende de un número fijo de columnas awkque no es el caso en la vida real ifconfig. Yo sugeriría algunos cambios sin embargo: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. El -omodo que grepsolo devuelve parte de la línea en lugar de todo el lote (más eficiente). Une caracteres que no sean espacios en blanco ( [^\s]*) para encontrar el final del token de máscara de red. Comillas simples alrededor del delimitador de campo por seguridad.
Oliver Dungey
en macOS puedo /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'generar la máscara en hexadecimal.
Tomachi
1

Si está buscando la máscara de red para el dispositivo de red predeterminado, este comando devuelve el dispositivo predeterminado ya que el dispositivo predeterminado podría no ser eth0

netdevice=$(ip r | grep default | awk '/default/ {print $5}')

Y este comando recupera la máscara:

netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')

Gracias a Eliah Kagan y Paulo Tome que me ayudaron a simplificar y aclarar la respuesta. En mi máquina personal, el dispositivo de Ethernet predeterminado era "wlx504654c1a91", que era demasiado complicado para recordar y escribir con precisión, de ahí el proceso de dos pasos.

Sailnfool
fuente
1
grep 'pattern' | awk '{ action }'generalmente se puede reducir aawk '/pattern/ { action }'
roaima