วิธีใช้ ifconfig เพื่อแสดงอินเตอร์เฟสที่แอ็คทีฟเท่านั้น


22

โดยค่าเริ่มต้นifconfigจะแสดงให้ฉันอินเตอร์เฟซที่มีอยู่ทั้งหมด แต่ถ้าผมแค่อยากจะแสดงผลactiveคน? ชอบen0เฉพาะด้านล่าง

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 14:10:9f:e0:eb:c9 
    inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4 
    inet X.X.X.X netmask 0xffffff00 broadcast 101.6.69.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 32:00:14:e7:4f:80 
    media: autoselect <full-duplex>
    **status: inactive**

การแจ้งเตือนifconfig en0จะไม่เป็นที่น่าพอใจen0เสมอไป)

ฉันใช้ Mac OS X


2
ระบบปฏิบัติการของคุณจะเป็นสิ่งสำคัญที่จะกล่าวถึงเนื่องจากifconfigการใช้งานแตกต่างกันไป นอกจากนี้เหตุใดจึงต้องมีการใช้ifconfigข้อกำหนด เป้าหมายสุดท้ายของคุณคืออะไร
จอร์แดน

สวัสดี @ jordanm เป้าหมายของฉันคือการได้รับที่อยู่ IP ของอินเทอร์เฟซที่ใช้งานอยู่ในปัจจุบันซึ่งมักจะเป็นอินเตอร์เฟซอีเธอร์เน็ตแบบใช้สายหรือแบบมีสาย
qweruiop

คุณจะกำหนดอินเทอร์เฟซที่ใช้งานได้อย่างไร
AnonymousLurker

คำตอบ:


24

ในการรับรายละเอียดทั้งหมดของบริการที่ใช้งานอยู่ให้ลอง:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

regex ง่าย ๆ นี้ควรกรองเฉพาะอินเตอร์เฟสที่แอ็คทีฟและข้อมูลทั้งหมด ฉันแน่ใจว่าคุณใส่ชื่อแทนไว้ในไฟล์ ~ / .profile หรือ ~ / .bash_profile (อาจจะใช้งานได้หรือไม่)

ในการรับชื่ออินเตอร์เฟส (มีประโยชน์สำหรับสคริปต์) ให้ใช้:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

คุณต้องติดตั้งpcregrepเพื่อให้ทำงานได้ มันอยู่ในmacportsในแพ็คเกจ pcre อีกทางหนึ่งสิ่งนี้ควรทำงานกับ GNU grep ที่ใช้grep -Pzoแทนpcregrep -M -oแต่กับที่เหลือเหมือนกัน แต่ฉันไม่ได้ทดสอบสิ่งนี้


2

หากคุณต้องการพิมพ์“ รายการ” หากมีอยู่status: activeคุณสามารถใช้บางอย่างเช่นโปรแกรมawkนี้เป็นตัวกรองไปยังเอาต์พุตifconfig :

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

เมื่อแต่ละรายการ“ เริ่ม” (บรรทัดว่างเปล่าหรือไม่ได้เริ่มต้นด้วย Tab) ให้เริ่มบันทึกรายการในบัฟเฟอร์ ผนวกเข้ากับบัฟเฟอร์นี้บรรทัดถัดไปที่เริ่มต้นด้วย Tab ดูสายมายากลstatus: active; หากเห็นบรรทัดดังกล่าวให้พิมพ์บัฟเฟอร์ (รายการก่อนหน้านี้) เมื่อเริ่มต้นรายการใหม่ (หรืออินพุตสิ้นสุด)

บันทึกข้อความโปรแกรมข้างต้นลงในไฟล์และใช้งานเช่นนี้:

ifconfig -a | awk -f /path/to/file

หรือถ้าคุณchmod +xเป็นไฟล์คุณสามารถทำให้มันง่ายขึ้นเล็กน้อย:

ifconfig -a | /path/to/file

2

หากคุณไม่ชอบการทำสคริปต์ทุบตีคุณสามารถทำสิ่งนี้ได้:

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

นั่นจะแสดงรายการอินเทอร์เฟซเครือข่ายที่ใช้งานอยู่ ทดสอบบน Mac OS X 10.13

สิ่งที่ดีคือคุณไม่จำเป็นต้องติดตั้งอะไรเลย เพียงเรียกใช้ข้างต้นในเทอร์มินัล


นี่ควรเป็นคำตอบที่ดีที่สุด แต่ifconfig -luจะไม่สามารถใช้กับเดเบียนได้ แต่ OP ใช้ MacOS อยู่แล้วดังนั้นการแก้ปัญหานี้จะทำงานในระบบที่มี ifconfigBSD ฉันโพสต์คำตอบอื่นด้านล่างซึ่งทำเช่นเดียวกันโดยไม่ใช้ifconfig -lu
Rakib Fiha

1

อ่านความคิดเห็นและคำถามของคุณดูเหมือนว่าคุณต้องการได้รับอินเทอร์เฟซที่มีการกำหนดที่อยู่ IP ให้กับพวกเขา

คุณสามารถทำเช่นนี้ได้อย่างรวดเร็วด้วยและifconfiggrep

กำลังรันคำสั่ง:

ifconfig | grep 'Link\|inet'

ควรผลิตสิ่งที่คล้ายกับ:

eth0 ลิงก์ encap: อีเทอร์เน็ต HWaddr 00: 11: 22: 33: 44: 55
eth1 ลิงก์ encap: อีเทอร์เน็ต HWaddr 00: 11: 22: 33: 44: 66  
          inet addr: 192.168.0.8 Bcast: 192.168.0.255 รูปแบบ: 255.255.255.0
lo Link encap: Local Loopback  
          inet addr: 127.0.0.1 รูปแบบ: 255.0.0.0

นี่จะแสดงแต่ละบรรทัดด้วยชื่ออินเตอร์เฟสและและ IP หากมี

เวทมนตร์ของ REGEX ที่เจาะจงมากขึ้นอาจทำให้คุณได้ในสิ่งที่คุณต้องการ


2
ขอบคุณ แต่การactiveพิจารณาอยู่ที่ไหน
qweruiop

หากมีบรรทัดหลังจากอินเทอร์เฟซก็จะมีที่อยู่ IP ที่กำหนดให้และสิ่งที่ฉันรวบรวมคุณหมายถึงมันจะเป็น 'ใช้งาน'
Nathan McCoy

1

ฉันหวังว่าคำถามจะชัดเจนขึ้น สมมติว่าโดยActive interface onlyคุณหมายถึงการแสดงชื่อของส่วนต่อประสานที่ใช้งานเท่านั้น (ในกรณีUPและRUNNINGสถานะของฉันactive) โดยไม่มีรายละเอียดอื่นใด จากนั้นลองสิ่งนี้:

ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo

ผลลัพธ์จะมีลักษณะดังนี้:

en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6

ปรับgrep -vฟิลด์และเพิ่มอินเทอร์เฟซที่ไม่ต้องการเช่นloopback-> loetc หากจำเป็น

ตอนนี้ถ้าคุณต้องการและคุณจะต้องตรวจสอบว่าอินเตอร์เฟซที่พบว่ามีการใช้งานในปัจจุบัน จากนั้นเราก็สามารถส่งพวกเขาเป็นอาร์กิวเมนต์สำหรับifconfig <interface>ตัวอย่างที่แสดงด้านล่าง:

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

ลดความซับซ้อนนี้เพิ่มเติมและนำไปใช้ในฟังก์ชั่น:

checkActiveInterfaces()
{
  local intARR=( $(ifconfig | \
      grep "UP\|RUNNIG" \
      | awk '{print $1}' \
      | grep ':' \
      | tr -d ':' \
      | grep -v lo) );
    intARR=( $(printf "%s\n" "${intARR[@]}" | sort -u) );
    for i in "${intARR[@]}"; do
      [[ $(ifconfig $i | grep -w active) ]] && {
       echo "$i"
    }
    done
}

การใช้งานฟังก์ชั่นนี้จะส่งคืนเฉพาะอินเตอร์เฟสที่ใช้งานอยู่ ในกรณีของฉัน:

awdl0
en0
llw0

0

การติดตามจะพิมพ์เฉพาะอินเทอร์เฟซที่กำหนดค่าให้มี IP

ifconfig | grep "inet.*broadcast"

0

รับ MAC ที่ใช้งานได้เท่านั้น:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address

โปรดทราบว่า MacOS ไม่มีipตามค่าเริ่มต้น คุณต้องใช้ HomeBrew ในการดำเนินการbrew install iproute2macนี้ ซอร์สโค้ดของมันอยู่ที่github.com/brona/iproute2mac
Jeroen Wiert Pluimers

-1
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

มันทำงานอย่างไร:

  • ifconfig
  • Grep สำหรับบรรทัดที่มี "inet addr"
    • บรรทัดเหล่านี้มี IP
  • Grep สำหรับบรรทัดที่ไม่มี "127.0.0.1"
    • เรามักจะไม่สนใจ localhost
    • -v เป็น grep แบบคว่ำ
  • จากบรรทัดที่เหลือให้ลบ "Bcast"
  • ตัดฟิลด์ 2 โดยใช้ ":" เป็นตัวคั่น
    • พิมพ์คำตอบ

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