Jak zdobyć maskę sieciową z bash?

8

Chcę pobrać moją maskę sieciową w systemie Linux. Jest wyprowadzane za pomocą, ifconfigale chcę wyodrębnić ciąg.

michelemarcon
źródło
5
To pytanie jest trudne, jeśli nie określisz swojego systemu operacyjnego, np. ifconfigLinia maski sieci FreeBSD brzmi:, inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255więc chociaż odpowiedzi można łatwo dostosować, prawdopodobnie nie ma jednego uniwersalnego rozwiązania (tylko przy użyciu Bash / ifconfig) .
sr_

Odpowiedzi:

8

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

O ifconfig w Linuksie

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)

Analiza i porównanie ram z perspektywy użytkowników

ata
źródło
Jeśli dany interfejs nie ma maski sieci, to rozwiązanie zwraca „1”. Wyrażenie regularne wymaga poważnych przeróbek, aby uczynić go niezawodnym / bezpiecznym, w tym potrzeby prawidłowego zakotwiczenia bardzo ważnego słowa „maska”.
Oliver Dungey,
7
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '

?

symcbean
źródło
Brakuje ci | Wytnij -c6-, aby usunąć również „Mask:”
michelemarcon,
3
Określenie separatora pól awk działa również w celu usunięcia „Mask:”:/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane
W Debian Stretch / net-tools 2.10-alfa musiałem zmienić na:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane
7

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.

mivk
źródło
2
... tak naprawdę nie jest konieczne dopasowanie opcji „zakres globalny” lub „domyślny”, tak jak możesz ip -o -f inet addr show scope globali ip route list default.
bryn
3

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"
Tim Kennedy
źródło
2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
ztank1013
źródło
Jest to najlepsza jak dotąd odpowiedź, ponieważ reszta polega na stałej liczbie kolumn, z awkktórych nie korzysta się w rzeczywistości ifconfig. Chciałbym zaproponować kilka zmian ale: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. -oTak że grepzwraca 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.
Oliver Dungey
na macOS mam /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'wyprowadzić maskę w postaci szesnastkowej.
Tomachi
1

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.

głupiec
źródło
1
grep 'pattern' | awk '{ action }'zwykle można zmniejszyć doawk '/pattern/ { action }'
roaima