ฉันต้องการ netmask ของฉันบน Linux มันเป็นเอาต์พุตที่มีifconfig
แต่ฉันต้องการแยกสตริง
ฉันต้องการ netmask ของฉันบน Linux มันเป็นเอาต์พุตที่มีifconfig
แต่ฉันต้องการแยกสตริง
คำตอบ:
ฉันควรชี้แจงว่ารหัสที่นี่ใช้งานได้กับ Linux (หมายเหตุความคิดเห็นและโพสต์เกี่ยวกับ Unices อื่น ๆ ) OP ขอโซลูชัน Linux แต่เป็นการดีที่จะเปลี่ยนคำถามเป็น "วิธีรับ netmask" โดยทั่วไปและให้คำตอบรวมวิธีที่ดีที่สุดสำหรับ Unix รสชาติมากขึ้น
#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'
./script eth0
พร้อมกับคำสั่งเครือข่ายแบบดั้งเดิมอื่น ๆ เช่น netstat, arp, rarp และเส้นทาง ifconfig เป็นส่วนหนึ่งของแพ็คเกจเครื่องมือเน็ต Net-tools ยังไม่ได้รับการพัฒนาอย่างจริงจังมาเป็นเวลานานและมีความพยายามที่จะเลิกใช้มันเพื่อรองรับแพ็คเกจiproute2รุ่นใหม่ เพื่อความกระชับถ้าคุณต้องการรายละเอียดเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงพื้นฐานนี้นี่คือลิงค์ที่เกี่ยวข้อง:
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '
?
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
ฉันสงสัยว่าคุณต้องการหน้ากากจริงๆหรือไม่ บางทีคุณอาจต้องการเครือข่าย (หรือ 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" บนเครื่องของฉัน
ip -o -f inet addr show scope global
ip route list default
หากคุณใช้ระบบปฏิบัติการที่ให้เอาท์พุตมาส์กเป็น 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"
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
awk
ifconfig
ฉันขอแนะนำการเปลี่ยนแปลงเล็กน้อยว่า: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2
. การส่งคืน-o
จึงเป็นgrep
เพียงส่วนหนึ่งของบรรทัดมากกว่าล็อตทั้งหมด (มีประสิทธิภาพมากกว่า) จับคู่อักขระที่ไม่ใช่ช่องว่าง ( [^\s]*
) เพื่อค้นหาจุดสิ้นสุดของโทเค็น netmask เครื่องหมายคำพูดเดี่ยวรอบตัวคั่นฟิลด์เพื่อความปลอดภัย
/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'
จะเอาท์พุทมาส์กเป็น hex
หากคุณกำลังมองหา netmask สำหรับอุปกรณ์เครือข่ายเริ่มต้นคำสั่งนี้จะส่งกลับอุปกรณ์เริ่มต้นเนื่องจากอุปกรณ์เริ่มต้นอาจไม่เป็น eth0
netdevice=$(ip r | grep default | awk '/default/ {print $5}')
และคำสั่งนี้ดึงมาสก์:
netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')
ขอบคุณ Eliah Kagan และ Paulo Tome ที่ช่วยให้ฉันทั้งง่ายขึ้นและชี้แจงคำตอบ ในเครื่องส่วนตัวของฉันอุปกรณ์อีเธอร์เน็ตเริ่มต้นคือ "wlx504654c1a91" ซึ่งเป็นวิธีที่ซับซ้อนเกินกว่าที่จะจำและพิมพ์ได้อย่างถูกต้องดังนั้นกระบวนการสองขั้นตอน
grep 'pattern' | awk '{ action }'
สามารถลดเป็นawk '/pattern/ { action }'
ifconfig
บรรทัด netmask ของ FreeBSD คือ:inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
ดังนั้นในขณะที่คำตอบสามารถปรับได้อย่างง่ายดายอาจไม่มีขนาดที่เหมาะกับทุกคน (ใช้ Bash / ifconfig เท่านั้น) .