Ich möchte meine Netzmaske unter Linux bekommen. Es wird ausgegeben mit, ifconfig
aber ich möchte den String extrahieren.
Ich möchte meine Netzmaske unter Linux bekommen. Es wird ausgegeben mit, ifconfig
aber ich möchte den String extrahieren.
Antworten:
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
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:
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '
?
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
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 nmap
oder 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.
ip -o -f inet addr show scope global
und ip route list default
.
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"
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
awk
beruht, 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 -o
also grep
nur 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.
/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'
die maske hexadezimal ausgeben.
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.
grep 'pattern' | awk '{ action }'
kann normalerweise aufawk '/pattern/ { action }'
ifconfig
lautet die Netzmaskenzeile von FreeBSD: Obwohlinet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
die Antworten leicht angepasst werden können, gibt es wahrscheinlich keine Einheitsgröße (nur mit Bash / ifconfig). .