วิธีการรับ netmask จากการทุบตี?


8

ฉันต้องการ netmask ของฉันบน Linux มันเป็นเอาต์พุตที่มีifconfigแต่ฉันต้องการแยกสตริง


5
คำถามนี้ยากจริง ๆ แล้วถ้าคุณไม่ได้ระบุระบบปฏิบัติการของคุณเช่นifconfigบรรทัด netmask ของ FreeBSD คือ: inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255ดังนั้นในขณะที่คำตอบสามารถปรับได้อย่างง่ายดายอาจไม่มีขนาดที่เหมาะกับทุกคน (ใช้ Bash / ifconfig เท่านั้น) .
sr_

คำตอบ:


8

ฉันควรชี้แจงว่ารหัสที่นี่ใช้งานได้กับ Linux (หมายเหตุความคิดเห็นและโพสต์เกี่ยวกับ Unices อื่น ๆ ) OP ขอโซลูชัน Linux แต่เป็นการดีที่จะเปลี่ยนคำถามเป็น "วิธีรับ netmask" โดยทั่วไปและให้คำตอบรวมวิธีที่ดีที่สุดสำหรับ Unix รสชาติมากขึ้น

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

./script eth0

เกี่ยวกับ ifconfig ใน Linux

พร้อมกับคำสั่งเครือข่ายแบบดั้งเดิมอื่น ๆ เช่น netstat, arp, rarp และเส้นทาง ifconfig เป็นส่วนหนึ่งของแพ็คเกจเครื่องมือเน็ต Net-tools ยังไม่ได้รับการพัฒนาอย่างจริงจังมาเป็นเวลานานและมีความพยายามที่จะเลิกใช้มันเพื่อรองรับแพ็คเกจiproute2รุ่นใหม่ เพื่อความกระชับถ้าคุณต้องการรายละเอียดเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงพื้นฐานนี้นี่คือลิงค์ที่เกี่ยวข้อง:

ตัวอย่างกรณี: Debian Linux

ตัวอย่างกรณี: Arch Linux

Man page สำหรับเครื่องมือ net ifconfig (ดูหัวข้อ BUGS)

การวิเคราะห์และเปรียบเทียบกรอบจากมุมมองของผู้ใช้


หากอินเตอร์เฟสที่เป็นปัญหานั้นไม่มี netmask โซลูชันนี้จะส่งคืน '1' regex ต้องการการทำใหม่อย่างจริงจังเพื่อให้เชื่อถือได้ / ปลอดภัยรวมถึงความต้องการสมอที่เหมาะสมในคำว่า 'Mask' ที่สำคัญมาก
Oliver Dungey

7
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '

?


คุณหายไป cut -c6- เพื่อที่จะลบ "Mask:"
michelemarcon

3
การระบุตัวคั่นฟิลด์ awk ยังใช้เพื่อลบ "Mask:":/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane

ใน Debian Stretch / net-tools 2.10-alpha ฉันต้องเปลี่ยนเป็น:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane

7

ฉันสงสัยว่าคุณต้องการหน้ากากจริงๆหรือไม่ บางทีคุณอาจต้องการเครือข่าย (หรือ IP) กับมาสก์เพื่อใช้ในไฟล์กำหนดค่าด้วยnmapหรืออะไรก็ตาม

ในกรณีนี้บน Linux คุณยังสามารถแยกเอาต์พุตของip ...คำสั่ง

ในการแสดงรายการอินเตอร์เฟสทั้งหมดพร้อมที่อยู่และมาสก์ของพวกเขาในรูปแบบ CIDR:

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

หรือเพื่อ จำกัด ไว้ที่ส่วนต่อประสานเริ่มต้น:

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

ซึ่งให้ฉัน "192.168.1.61/24" บนเครื่องของฉัน


2
... มันไม่จำเป็นจริงๆเพื่อให้ตรงกับที่ 'ขอบเขตทั่วโลก' หรือ 'เริ่มต้น' ไม่ว่าจะเป็นที่คุณสามารถทำได้และip -o -f inet addr show scope global ip route list default
bryn

3

หากคุณใช้ระบบปฏิบัติการที่ให้เอาท์พุตมาส์กเป็น hex คุณสามารถทำสิ่งต่อไปนี้:

#!/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"

2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4

นี่คือคำตอบที่ดีที่สุดป่านนี้เป็นส่วนที่เหลือพึ่งพาจำนวนคงที่ของคอลัมน์โดยใช้ที่ไม่ได้กรณีที่ในชีวิตจริงด้วยawk ifconfigฉันขอแนะนำการเปลี่ยนแปลงเล็กน้อยว่า: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. การส่งคืน-oจึงเป็นgrepเพียงส่วนหนึ่งของบรรทัดมากกว่าล็อตทั้งหมด (มีประสิทธิภาพมากกว่า) จับคู่อักขระที่ไม่ใช่ช่องว่าง ( [^\s]*) เพื่อค้นหาจุดสิ้นสุดของโทเค็น netmask เครื่องหมายคำพูดเดี่ยวรอบตัวคั่นฟิลด์เพื่อความปลอดภัย
Oliver Dungey

บน macOS ฉัน/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'จะเอาท์พุทมาส์กเป็น hex
Tomachi

1

หากคุณกำลังมองหา netmask สำหรับอุปกรณ์เครือข่ายเริ่มต้นคำสั่งนี้จะส่งกลับอุปกรณ์เริ่มต้นเนื่องจากอุปกรณ์เริ่มต้นอาจไม่เป็น eth0

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

และคำสั่งนี้ดึงมาสก์:

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

ขอบคุณ Eliah Kagan และ Paulo Tome ที่ช่วยให้ฉันทั้งง่ายขึ้นและชี้แจงคำตอบ ในเครื่องส่วนตัวของฉันอุปกรณ์อีเธอร์เน็ตเริ่มต้นคือ "wlx504654c1a91" ซึ่งเป็นวิธีที่ซับซ้อนเกินกว่าที่จะจำและพิมพ์ได้อย่างถูกต้องดังนั้นกระบวนการสองขั้นตอน


1
grep 'pattern' | awk '{ action }'สามารถลดเป็นawk '/pattern/ { action }'
roaima
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.