Saya ingin mendapatkan netmask saya di Linux. Ini dihasilkan dengan ifconfig
tetapi saya ingin mengekstrak string.
Saya ingin mendapatkan netmask saya di Linux. Ini dihasilkan dengan ifconfig
tetapi saya ingin mengekstrak string.
Jawaban:
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
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:
Halaman manual untuk net-tools ifconfig (lihat bagian BUGS)
Analisis dan perbandingan kerangka kerja dari perspektif pengguna
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '
?
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
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.
ip -o -f inet addr show scope global
dan ip route list default
.
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"
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
awk
yang bukan kasus nyata dalam kehidupan nyata ifconfig
. Saya akan menyarankan beberapa perubahan meskipun: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2
. The -o
sehingga grep
hanya 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.
/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'
menampilkan topeng dalam hex.
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.
grep 'pattern' | awk '{ action }'
biasanya dapat direduksi menjadiawk '/pattern/ { action }'
ifconfig
baris netmask FreeBSD adalah :,inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
jadi sementara jawabannya dapat dengan mudah disesuaikan, mungkin tidak ada satu ukuran yang cocok untuk semua (menggunakan Bash / ifconfig saja) .