Wie bekomme ich eine Netzmaske von Bash?

8

Ich möchte meine Netzmaske unter Linux bekommen. Es wird ausgegeben mit, ifconfigaber ich möchte den String extrahieren.

michelemarcon
quelle
5
Diese Frage ist tatsächlich schwierig, wenn Sie Ihr Betriebssystem nicht angeben, z. B. ifconfiglautet die Netzmaskenzeile von FreeBSD: Obwohl inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255die Antworten leicht angepasst werden können, gibt es wahrscheinlich keine Einheitsgröße (nur mit Bash / ifconfig). .
sr_

Antworten:

8

Ich sollte klarstellen, dass der Code hier für Linux funktioniert (beachten Sie Kommentare und Beiträge zu anderen Unices). OP fragte nach einer Linux-Lösung, aber es wäre gut, die Frage in "Wie bekomme ich eine Netzmaske?" Im Allgemeinen zu ändern und die Antwort den besten Weg für mehr Unix-Varianten kombinieren zu lassen.

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

./script eth0

Über ifconfig unter Linux

Zusammen mit anderen herkömmlichen Netzwerkbefehlen wie netstat, arp, rarp und route ist ifconfig Teil des net-tools- Pakets. Net-Tools wurden seit langer Zeit nicht mehr aktiv entwickelt, und es wird versucht, sie zugunsten des neueren iproute2- Pakets zu verwerfen . Wenn Sie der Kürze halber mehr Details zu diesem grundlegenden Übergang wünschen, finden Sie hier einige relevante Links:

Fallbeispiel: Debian Linux

Fallbeispiel: Arch Linux

Manpage für Net-Tools ifconfig (siehe Abschnitt BUGS)

Analyse und Vergleich der Frameworks aus Anwendersicht

an einer
quelle
Wenn die betreffende Schnittstelle keine Netzmaske hat, gibt diese Lösung '1' zurück. Der Regex muss ernsthaft überarbeitet werden, um ihn zuverlässig / sicher zu machen, einschließlich der Notwendigkeit eines richtigen Ankers für das sehr wichtige Wort "Maske".
Oliver Dungey
7
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '

?

symcbean
quelle
Sie vermissen | Schneiden Sie -c6-, um auch die "Maske" zu entfernen:
Michelemarcon
3
Das Angeben des awk-Feldtrennzeichens entfernt auch "Maske:":/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane
In Debian Stretch / Net-Tools 2.10-Alpha musste ich Folgendes ändern:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane
7

Ich frage mich, ob Sie wirklich nur die Maske wollen. Vielleicht möchten Sie wirklich, dass das Netzwerk (oder die IP) mit Maske in Konfigurationsdateien mit nmapoder was auch immer verwendet wird.

In diesem Fall können Sie unter Linux auch die Ausgabe des ip ...Befehls analysieren .

So listen Sie alle Schnittstellen mit ihrer Adresse und Maske in CIDR-Notation auf:

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

Oder um es auf die Standardschnittstelle zu beschränken:

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

Das gibt mir "192.168.1.61/24" auf meinem Computer.

mivk
quelle
2
... es ist nicht wirklich notwendig, auf 'scope global' oder 'default' abzustimmen, wie Sie es können ip -o -f inet addr show scope globalund ip route list default.
Bryn
3

Wenn Sie ein Betriebssystem verwenden, das die Maske in hexadezimaler Form ausgibt, können Sie Folgendes tun:

#!/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
quelle
2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
ztank1013
quelle
Dies ist die bisher beste Antwort, da der Rest auf einer festen Anzahl von Spalten awkberuht, bei denen dies im wirklichen Leben nicht der Fall ist ifconfig. Ich würde jedoch einige Änderungen vorschlagen : ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. Das gibt -oalso grepnur einen Teil der Linie zurück und nicht das ganze Los (effizienter). Ordnen Sie Nicht-Leerzeichen ( [^\s]*) zu, um das Ende des Netzmasken-Tokens zu finden. Einfache Anführungszeichen um das Feldtrennzeichen zur Sicherheit.
Oliver Dungey
unter macOS kann ich /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'die maske hexadezimal ausgeben.
Tomachi
1

Wenn Sie die Netzmaske für das Standardnetzwerkgerät suchen, gibt dieser Befehl das Standardgerät zurück, da das Standardgerät möglicherweise nicht eth0 ist

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

Und dieser Befehl ruft die Maske ab:

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

Vielen Dank an Eliah Kagan und Paulo Tome, die mir geholfen haben, die Antwort zu vereinfachen und zu klären. Auf meinem PC war das Standard-Ethernet-Gerät "wlx504654c1a91", was viel zu kompliziert war, um es sich zu merken und genau zu tippen, daher der zweistufige Prozess.

Sailnfool
quelle
1
grep 'pattern' | awk '{ action }'kann normalerweise aufawk '/pattern/ { action }'
roaima