Come ottenere netmask da bash?


8

Voglio ottenere la mia maschera di rete su Linux. Viene emesso ifconfigma voglio estrarre la stringa.


5
Questa domanda è difficile, in realtà, se non specifichi il tuo sistema operativo, ad esempio la ifconfiglinea di maschera di rete di FreeBSD è:, inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255quindi mentre le risposte possono essere facilmente regolate, probabilmente non c'è una soluzione unica (usando solo Bash / ifconfig) .
sr_

Risposte:


8

Dovrei chiarire che il codice qui funziona per Linux (nota commenti e post su altri Unices). OP ha chiesto una soluzione Linux, ma sarebbe bene cambiare la domanda in "come ottenere la maschera di rete" in generale, e avere la risposta che combini il modo migliore per più sapori Unix.

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

./script eth0

Informazioni su ifconfig in Linux

Insieme ad altri comandi di rete tradizionali come netstat, arp, rarp e route, ifconfig fa parte del pacchetto net-tools . Net-tools non è stato sviluppato attivamente da molto tempo e ci sono sforzi per deprecarlo a favore del nuovo pacchetto iproute2 . Per brevità, se vuoi maggiori dettagli su questa transizione fondamentale, ecco alcuni link rilevanti:

Esempio: Debian Linux

Esempio: Arch Linux

Pagina man per net-tools ifconfig (vedere la sezione BUGS)

Analisi e confronto dei framework dal punto di vista degli utenti


Se l'interfaccia in questione non ha una maschera di rete, questa soluzione restituisce '1'. Il regex ha bisogno di una serie di rilavorazioni per renderlo affidabile / sicuro, inclusa la necessità di un ancoraggio adeguato sulla parola molto importante "Maschera".
Oliver Dungey il

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

?


Manca | tagliare -c6- per rimuovere anche la "Maschera:"
michelemarcon

3
Specificare il separatore di campo awk funziona anche per rimuovere "Mask:":/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane

In Debian Stretch / net-tools 2.10-alpha ho dovuto cambiare questo:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane

7

Mi chiedo se vuoi davvero solo la maschera. Forse vuoi davvero che la rete (o IP) con maschera, da utilizzare nei file di configurazione, con nmapo altro.

In tal caso, su Linux, puoi anche analizzare l'output del ip ...comando.

Per elencare tutte le interfacce con il loro indirizzo e maschera nella notazione CIDR:

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

O per limitarlo all'interfaccia predefinita:

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

che mi dà "192.168.1.61/24" sulla mia macchina.


2
... non è davvero necessario abbinare 'scope globale' o 'default' come puoi ip -o -f inet addr show scope globale ip route list default.
bryn,

3

se stai usando un sistema operativo che genera la maschera in esadecimale, puoi fare qualcosa del tipo:

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

Questa è la risposta migliore in quanto gli altri si basano su un numero fisso di colonne con awkcui non è il caso nella vita reale ifconfig. Vorrei suggerire alcuni cambiamenti però: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. In questo -omodo greprestituisce solo parte della linea anziché l'intero lotto (più efficiente). Abbina caratteri non bianchi ( [^\s]*) per trovare la fine del token maschera di rete. Virgolette singole intorno al delimitatore di campo per sicurezza.
Oliver Dungey il

su macOS riesco /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'a visualizzare la maschera in esadecimale.
Tomachi,

1

Se stai cercando la maschera di rete per il dispositivo di rete predefinito, questo comando restituisce il dispositivo predefinito poiché il dispositivo predefinito potrebbe non essere eth0

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

E questo comando recupera la maschera:

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

Grazie a Eliah Kagan e Paulo Tome che mi hanno aiutato a semplificare e chiarire la risposta. Sulla mia macchina personale, il dispositivo Ethernet predefinito era "wlx504654c1a91", che era troppo complicato per ricordare e digitare con precisione, da cui il processo in due fasi.


1
grep 'pattern' | awk '{ action }'di solito può essere ridotto aawk '/pattern/ { action }'
roaima il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.