Chcę pobrać moją maskę sieciową w systemie Linux. Jest wyprowadzane za pomocą, ifconfig
ale chcę wyodrębnić ciąg.
Chcę pobrać moją maskę sieciową w systemie Linux. Jest wyprowadzane za pomocą, ifconfig
ale chcę wyodrębnić ciąg.
Odpowiedzi:
Powinienem wyjaśnić, że kod tutaj działa dla Linuksa (uwaga na komentarze i posty na temat innych Uniksów). OP poprosił o rozwiązanie dla Linuksa, ale dobrze byłoby zmienić pytanie na „jak uzyskać maskę sieci” i dać odpowiedź łączącą najlepszy sposób na więcej uniksowych smaków.
#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'
./script eth0
Oprócz innych tradycyjnych poleceń sieciowych, takich jak netstat, arp, rarp i route, ifconfig jest częścią pakietu net-tools . Net-tools nie było aktywnie rozwijane od bardzo dawna i istnieją starania, aby przestać go używać na rzecz nowszego pakietu iproute2 . Ze względu na zwięzłość, jeśli chcesz uzyskać więcej informacji na temat tego podstawowego przejścia, oto kilka odpowiednich linków:
Przykład przypadku: Debian Linux
Przykład przypadku: Arch Linux
Strona podręcznika dla net-tools ifconfig (patrz sekcja BŁĘDY)
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '
?
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Zastanawiam się, czy naprawdę chcesz tylko maski. Może naprawdę chcesz, aby sieć (lub adres IP) z maską była używana w plikach konfiguracyjnych, z nmap
, lub czymkolwiek.
W takim przypadku w systemie Linux można również przeanalizować dane wyjściowe ip ...
polecenia.
Aby wyświetlić listę wszystkich interfejsów wraz z ich adresem i maską w notacji CIDR:
ip -o -f inet addr show | awk '/scope global/ {print $2, $4}'
Lub ograniczyć go do domyślnego interfejsu:
default_if=$(ip route list | awk '/^default/ {print $5}')
ip -o -f inet addr show $default_if | awk '{print $4}'
co daje mi „192.168.1.61/24” na moim komputerze.
ip -o -f inet addr show scope global
i ip route list default
.
jeśli używasz systemu operacyjnego, który wyświetla maskę w postaci szesnastkowej, możesz zrobić coś takiego:
#!/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
których nie korzysta się w rzeczywistości ifconfig
. Chciałbym zaproponować kilka zmian ale: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2
. -o
Tak że grep
zwraca tylko część linii, a nie całej partii (bardziej wydajne). Dopasuj znaki spoza ( [^\s]*
), aby znaleźć koniec tokena maski sieci. Pojedyncze cudzysłowy wokół separatora pola dla bezpieczeństwa.
/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'
wyprowadzić maskę w postaci szesnastkowej.
Jeśli szukasz maski sieci dla domyślnego urządzenia sieciowego, to polecenie zwraca urządzenie domyślne, ponieważ domyślnym urządzeniem może nie być eth0
netdevice=$(ip r | grep default | awk '/default/ {print $5}')
A to polecenie pobiera maskę:
netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')
Dzięki Eliahowi Kaganowi i Paulo Tome, którzy pomogli mi zarówno uprościć, jak i wyjaśnić odpowiedź. Na mojej osobistej maszynie domyślnym urządzeniem ethernetowym było „wlx504654c1a91”, co było zbyt skomplikowane, aby zapamiętać i wpisać dokładnie, stąd proces dwuetapowy.
grep 'pattern' | awk '{ action }'
zwykle można zmniejszyć doawk '/pattern/ { action }'
ifconfig
Linia maski sieci FreeBSD brzmi:,inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
więc chociaż odpowiedzi można łatwo dostosować, prawdopodobnie nie ma jednego uniwersalnego rozwiązania (tylko przy użyciu Bash / ifconfig) .