Quero obter minha máscara de rede no Linux. É gerado com, ifconfig
mas quero extrair a string.
Quero obter minha máscara de rede no Linux. É gerado com, ifconfig
mas quero extrair a string.
Respostas:
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
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:
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
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '
?
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
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 nmap
ou 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.
ip -o -f inet addr show scope global
e ip route list default
.
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"
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
awk
que 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 -o
modo que grep
retorna 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.
/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'
a máscara em hexadecimal.
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.
grep 'pattern' | awk '{ action }'
geralmente pode ser reduzido paraawk '/pattern/ { action }'
ifconfig
a linha de máscara de rede do FreeBSD é :,inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
portanto, embora as respostas possam ser facilmente ajustadas, provavelmente não há um tamanho único (usando apenas Bash / ifconfig) .