Como obter a máscara de rede do bash?


8

Quero obter minha máscara de rede no Linux. É gerado com, ifconfigmas quero extrair a string.


5
Esta pergunta é difícil, na verdade, se você não especificar seu sistema operacional, por exemplo, ifconfiga linha de máscara de rede do FreeBSD é :, inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255portanto, embora as respostas possam ser facilmente ajustadas, provavelmente não há um tamanho único (usando apenas Bash / ifconfig) .
sr_

Respostas:


8

Devo esclarecer que o código aqui funciona para Linux (observe os comentários e poste sobre outros Unices). A OP pediu uma solução Linux, mas seria bom alterar a pergunta para "como obter a máscara de rede" em geral, e ter a resposta combinando a melhor maneira de obter mais sabores do Unix.

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

./script eth0

Sobre o ifconfig no Linux

Juntamente com outros comandos de rede tradicionais como netstat, arp, rarp e route, o ifconfig faz parte do pacote net-tools . O Net-tools não foi desenvolvido ativamente há muito tempo e há esforços para substituí-lo em favor do novo pacote iproute2 . Por uma questão de brevidade, se você quiser mais detalhes sobre essa transição fundamental, aqui estão alguns links relevantes:

Exemplo de caso: Debian Linux

Exemplo de caso: Arch Linux

Página de manual do net-tools ifconfig (consulte a seção BUGS)

Análise e comparação das estruturas da perspectiva dos usuários


Se a interface em questão não possuir máscara de rede, esta solução retornará '1'. O regex precisa de um retrabalho sério para torná-lo confiável / seguro, incluindo a necessidade de uma âncora adequada na palavra muito importante 'Máscara'.
Oliver Dungey

7
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '

?


Está faltando | cortar -c6-, a fim de também remover a "máscara"
michelemarcon

3
A especificação do separador de campo awk também funciona para remover "Mask:":/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane

No Debian Stretch / net-tools 2.10-alpha eu tive que mudar para isso:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane

7

Gostaria de saber se você realmente quer apenas a máscara. Talvez você realmente queira que a rede (ou IP) com máscara seja usada em arquivos de configuração, com nmapou qualquer outra coisa.

Nesse caso, no Linux, você também pode analisar a saída do ip ...comando.

Para listar todas as interfaces com seus endereços e máscaras na notação CIDR:

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

Ou para restringi-lo à interface padrão:

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

o que me dá "192.168.1.61/24" na minha máquina.


2
... não é realmente necessário corresponder no 'escopo global' ou no 'padrão', como você pode fazer ip -o -f inet addr show scope globale ip route list default.
Bryn

3

se você estiver usando um sistema operacional que gera a máscara em hexadecimal, pode fazer 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"

2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4

Esta é a melhor resposta, na medida em que o restante depende de um número fixo de colunas, o awkque não é o caso na vida real ifconfig. Gostaria de sugerir algumas mudanças no entanto: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. O -omodo que grepretorna apenas parte da linha e não o lote inteiro (mais eficiente). Faça a correspondência de caracteres que não sejam espaços em branco ( [^\s]*) para encontrar o final do token de máscara de rede. Aspas simples ao redor do delimitador de campo para segurança.
Oliver Dungey

no macOS, pego /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'a máscara em hexadecimal.
Tomachi

1

Se você estiver procurando a máscara de rede para o dispositivo de rede padrão, este comando retornará o dispositivo padrão, pois o dispositivo padrão pode não ser eth0

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

E este comando recupera a máscara:

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

Agradeço a Eliah Kagan e Paulo Tomé que me ajudaram a simplificar e esclarecer a resposta. Na minha máquina pessoal, o dispositivo Ethernet padrão era "wlx504654c1a91", o que era muito complicado para lembrar e digitar com precisão, daí o processo de duas etapas.


11
grep 'pattern' | awk '{ action }'geralmente pode ser reduzido paraawk '/pattern/ { action }'
roaima
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.