Comment obtenir le masque de réseau de bash?

8

Je veux obtenir mon masque de réseau sous Linux. Il est sorti avec ifconfigmais je veux extraire la chaîne.

michelemarcon
la source
5
Cette question est difficile, en fait, si vous ne spécifiez pas votre système d'exploitation, par exemple la ifconfigligne de masque de réseau de FreeBSD est :, inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255donc bien que les réponses puissent être facilement ajustées, il n'y a probablement pas de solution universelle (en utilisant Bash / ifconfig uniquement) .
sr_

Réponses:

8

Je dois préciser que le code fonctionne ici pour Linux, (notez les commentaires et publiez sur d'autres Unices). OP a demandé une solution Linux, mais il serait bon de changer la question en "comment obtenir un masque de réseau" en général, et d'avoir la réponse combiner la meilleure façon pour plus de saveurs Unix.

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

./script eth0

À propos d'ifconfig sous Linux

Avec d'autres commandes de mise en réseau traditionnelles comme netstat, arp, rarp et route, ifconfig fait partie du package net-tools . Net-tools n'a pas été activement développé depuis très longtemps et des efforts sont déployés pour le déprécier en faveur du nouveau package iproute2 . Par souci de concision, si vous souhaitez plus de détails sur cette transition fondamentale, voici quelques liens pertinents:

Exemple de cas: Debian Linux

Exemple de cas: Arch Linux

Page de manuel de net-tools ifconfig (voir la section BUGS)

Analyse et comparaison des frameworks du point de vue des utilisateurs

à
la source
Si l'interface en question n'a pas de masque de réseau, cette solution renvoie «1». Le regex a besoin de quelques retouches sérieuses pour le rendre fiable / sûr, y compris la nécessité d'une ancre appropriée sur le mot très important «masque».
Oliver Dungey
7
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '

?

symcbean
la source
Vous êtes absent | couper -c6- afin de retirer également le "Masque:"
michelemarcon
3
La spécification du séparateur de champ awk fonctionne également pour supprimer le "Masque:":/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane
Dans Debian Stretch / net-tools 2.10-alpha, je devais changer ceci:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane
7

Je me demande si tu ne veux vraiment que le masque. Peut-être que vous voulez vraiment que le réseau (ou IP) avec masque soit utilisé dans les fichiers de configuration, avec nmapou autre.

Dans ce cas, sous Linux, vous pouvez également analyser la sortie de la ip ...commande.

Pour répertorier toutes les interfaces avec leur adresse et leur masque en notation CIDR:

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

Ou pour le restreindre à l'interface par défaut:

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

ce qui me donne "192.168.1.61/24" sur ma machine.

mivk
la source
2
... il n'est pas vraiment nécessaire de faire correspondre "portée globale" ou "par défaut" comme vous pouvez le faire ip -o -f inet addr show scope globalet ip route list default.
bryn
3

si vous utilisez un système d'exploitation qui génère le masque en hexadécimal, vous pouvez faire quelque chose comme:

#!/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
la source
2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
ztank1013
la source
C'est la meilleure réponse dans la mesure où les autres reposent sur un nombre fixe de colonnes utilisant awkce qui n'est pas le cas dans la vraie vie ifconfig. Je suggère quelques modifications cependant: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. Le -oafin que grepne renvoie qu'une partie de la ligne plutôt que l'ensemble du lot (plus efficace). Faites correspondre les caractères non blancs ( [^\s]*) pour trouver la fin du jeton de masque de réseau. Des guillemets simples autour du délimiteur de champ pour plus de sécurité.
Oliver Dungey
sur macOS, je peux sortir /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'le masque en hexadécimal.
Tomachi
1

Si vous recherchez le masque de réseau pour le périphérique réseau par défaut, cette commande renvoie le périphérique par défaut car le périphérique par défaut n'est peut-être pas eth0

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

Et cette commande récupère le masque:

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

Merci à Eliah Kagan et Paulo Tome qui m'ont aidé à la fois à simplifier et à clarifier la réponse. Sur ma machine personnelle, le périphérique Ethernet par défaut était "wlx504654c1a91", ce qui était beaucoup trop compliqué à mémoriser et à taper avec précision, d'où le processus en deux étapes.

sailnfool
la source
1
grep 'pattern' | awk '{ action }'peut généralement être réduit àawk '/pattern/ { action }'
roaima