Bagaimana cara mendapatkan netmask dari bash?

8

Saya ingin mendapatkan netmask saya di Linux. Ini dihasilkan dengan ifconfigtetapi saya ingin mengekstrak string.

michelemarcon
sumber
5
Pertanyaan ini sulit, sebenarnya, jika Anda tidak menentukan OS Anda, misalnya ifconfigbaris netmask FreeBSD adalah :, inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255jadi sementara jawabannya dapat dengan mudah disesuaikan, mungkin tidak ada satu ukuran yang cocok untuk semua (menggunakan Bash / ifconfig saja) .
sr_

Jawaban:

8

Saya harus mengklarifikasi bahwa kode di sini berfungsi untuk Linux, (perhatikan komentar dan pos tentang Unix lainnya). OP meminta solusi Linux, tetapi akan lebih baik untuk mengubah pertanyaan menjadi "cara mendapatkan netmask" secara umum, dan mintalah jawabannya menggabungkan cara terbaik untuk lebih banyak rasa Unix.

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

./script eth0

Tentang ifconfig di Linux

Bersamaan dengan perintah jaringan tradisional lainnya seperti netstat, arp, rarp dan route, ifconfig adalah bagian dari paket net-tools . Net-tools belum dikembangkan secara aktif dari waktu yang sangat lama dan ada upaya untuk mencabutnya dari paket iproute2 yang lebih baru . Demi singkatnya, jika Anda ingin detail lebih lanjut tentang transisi mendasar ini, berikut adalah beberapa tautan yang relevan:

Contoh kasus: Debian Linux

Contoh kasus: Arch Linux

Halaman manual untuk net-tools ifconfig (lihat bagian BUGS)

Analisis dan perbandingan kerangka kerja dari perspektif pengguna

ata
sumber
Jika antarmuka yang dimaksud tidak memiliki netmask, solusi ini mengembalikan '1'. Regex membutuhkan beberapa pengerjaan ulang yang serius untuk membuatnya dapat diandalkan / aman termasuk kebutuhan untuk jangkar yang tepat pada kata yang sangat penting 'Topeng'.
Oliver Dungey
7
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '

?

symcbean
sumber
Anda hilang | cut -c6- untuk juga menghapus "Mask:"
michelemarcon
3
Menentukan pemisah bidang awk juga berfungsi untuk menghapus "Mask:":/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane
Dalam Debian Stretch / net-tools 2.10-alpha saya harus mengubah ini:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane
7

Saya ingin tahu apakah Anda benar-benar hanya menginginkan topeng. Mungkin Anda benar-benar menginginkan jaringan (atau IP) dengan mask, untuk digunakan dalam file konfigurasi, dengan nmap, atau apa pun.

Dalam hal itu, di Linux, Anda juga dapat mengurai output dari ip ...perintah.

Untuk membuat daftar semua antarmuka dengan alamat dan penutupnya dalam notasi CIDR:

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

Atau untuk membatasi ke antarmuka default:

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

yang memberi saya "192.168.1.61/24" di komputer saya.

mivk
sumber
2
... tidak perlu mencocokkan pada 'lingkup global' atau 'standar' seperti yang dapat Anda lakukan ip -o -f inet addr show scope globaldan ip route list default.
bryn
3

jika Anda menggunakan OS yang menampilkan mask dalam hex, Anda dapat melakukan sesuatu seperti:

#!/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
sumber
2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
ztank1013
sumber
Ini adalah jawaban terbaik sejauh sisanya mengandalkan jumlah kolom tetap awkyang bukan kasus nyata dalam kehidupan nyata ifconfig. Saya akan menyarankan beberapa perubahan meskipun: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. The -osehingga grephanya kembali bagian dari garis daripada seluruh banyak (lebih efisien). Cocokkan karakter non-spasi putih ( [^\s]*) untuk menemukan akhir token netmask. Kutipan tunggal di sekitar pembatas lapangan untuk keselamatan.
Oliver Dungey
pada macOS saya bisa /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'menampilkan topeng dalam hex.
Tomachi
1

Jika Anda mencari netmask untuk perangkat jaringan default, perintah ini mengembalikan perangkat default karena perangkat default mungkin bukan eth0

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

Dan perintah ini mengambil topeng:

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

Terima kasih kepada Eliah Kagan dan Paulo Tome yang membantu saya menyederhanakan dan mengklarifikasi jawabannya. Pada mesin pribadi saya, perangkat ethernet default adalah "wlx504654c1a91" yang terlalu rumit untuk diingat dan diketik secara akurat, karenanya proses dua langkah.

sailnfool
sumber
1
grep 'pattern' | awk '{ action }'biasanya dapat direduksi menjadiawk '/pattern/ { action }'
roaima