วิธีรับชื่ออุปกรณ์ macOS Wi-Fi โดยทางโปรแกรมใน Bash script


1
bash% networksetup -listnetworkserviceorder
An asterisk (*) denotes that a network service is disabled.
(1) SAMSUNG Modem
(Hardware Port: Modem (SAMSUNG_MDM), Device: SAMSUNG_MDM)

(2) Ethernet
(Hardware Port: Ethernet, Device: en0)

(3) FireWire
(Hardware Port: FireWire, Device: fw0)

(4) Wi-Fi
(Hardware Port: Wi-Fi, Device: en1)

(5) Bluetooth PAN
(Hardware Port: Bluetooth PAN, Device: en2)

สิ่งนี้ดีสำหรับการอ่าน แต่ฉันจะ 'en1' โดยทางโปรแกรมในสคริปต์ Bash ได้อย่างไรเพื่อให้ฉันสามารถใช้ชื่ออุปกรณ์ในงาน cron ได้

คำตอบ:


1

ในคำถามของคุณฉันรู้ว่าคุณใช้ networksetup -listnetworkserviceorder แต่ฉันจะใช้ networksetup -listallhardwareports แทนที่จะเป็นการง่ายกว่าในการแยกวิเคราะห์เอาต์พุตโดยใช้ awkด้วยตัวเองอย่างน้อยการเข้ารหัสเพื่อหลีกเลี่ยงหลาย ท่อ ใช้หลาย ๆ คำสั่ง ตามที่เสนอในคำตอบอื่น ๆ และควรแข็งแกร่งเพียงพอที่จะสร้างผลลัพธ์ที่สอดคล้องกันจนกว่า Apple จะเปลี่ยนรูปแบบผลลัพธ์ของ networksetup -listallhardwareportsถ้าพวกเขาเคยทำ

เป็นตัวอย่างในระบบของฉัน networksetup -listallhardwareports แสดงดังต่อไปนี้:

$ networksetup -listallhardwareports

Hardware Port: Bluetooth DUN
Device: Bluetooth-Modem
Ethernet Address: N/A

Hardware Port: Display Ethernet
Device: en3
Ethernet Address: xx:xx:xx:xx:xx:xx

Hardware Port: Display FireWire
Device: fw0
Ethernet Address: xx:xx:xx:xx:xx:xx

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: xx:xx:xx:xx:xx:xx

Hardware Port: Bluetooth PAN
Device: en2
Ethernet Address: N/A

VLAN Configurations
===================
$ 

ดูบรรทัดผลลัพธ์ที่เกี่ยวข้อง:

Hardware Port: Wi-Fi
Device: en0

วิธีที่ง่ายที่สุดที่จะได้รับ en0ในตัวอย่างนี้คือ:

networksetup -listallhardwareports | awk '/Wi-Fi/{getline; print $2}'

มันสามารถกำหนดให้กับตัวแปร:

wifiDevice="$(networksetup -listallhardwareports | awk '/Wi-Fi/{getline; print $2}')"

จากนั้นคุณสามารถใช้ $wifiDevice ในภายหลังเพื่อเป็นตัวแทนสคริปต์ en0ในตัวอย่างนี้

เห็นได้ชัดว่าระบบของคุณขึ้นอยู่กับผลลัพธ์ในคำถามของคุณ $wifiDevice อยากจะเป็น: en1


หากคุณต้องการใช้ networksetup -listnetworkserviceorder จากนั้นคุณสามารถใช้ awkในลักษณะนี้:

networksetup -listnetworkserviceorder | awk '{gsub(/\)/, "")}/Wi-Fi, Device/{print $5}'

อย่างไรก็ตามฉันจะใช้ตัวอย่างแรกของฉันมากกว่านี้


ฉันจะอยู่ห่างจากการใช้ system_profiler ในกรณีนี้เนื่องจากต้องใช้เวลานานในการสร้างเอาต์พุตเมื่อใช้ networksetup.


คำตอบที่ดี แต่ system_profiler ไม่ต้องใช้เวลานานในการสร้างเอาต์พุตเมื่อคุณระบุชนิดข้อมูลที่คุณต้องการ: system_profiler SPAirPortDataType สิ่งที่ต้องใช้เวลาคือเมื่อมันมีการสร้าง ทั้งหมด ประเภทข้อมูล
Allan

@ อัลลันฉันไม่ได้พูดถึงการทำงาน system_profiler ไม่มีข้อโต้แย้ง! ฉันกำลังเปรียบเทียบเวลาที่ใช้จริง networksetup -listallhardwareports เมื่อเทียบกับ system_profiler SPAirPortDataTypeที่ไหนเช่น ในระบบของฉันอดีตนั้นทันทีเมื่อเทียบกับหลัง 0m0.025s เมื่อเทียบกับ 0m3.296s! ที่ ~ 130 ครั้งเร็วขึ้นไม่มีการแข่งขันและทำไมฉันจึงพูด
user3439894

1

คุณสามารถไพพ์เอาท์พุท grep awk และ cut เป็นตัวเลือก:

networksetup -listnetworkserviceorder | grep -i "Wi-Fi, Device" | awk '{ print $5 }' | cut -c 1-3

คุณยังสามารถใช้ system_profiler เพื่อรับรายละเอียดเกี่ยวกับอะแดปเตอร์ AirPort ของคุณ:

system_profiler SPAirPortDataType

จากนั้นคุณสามารถอีกครั้งไพพ์เอาต์พุตผ่าน grep เพื่อรับอะแด็ปเตอร์ของคุณ:

system_profiler SPAirPortDataType | grep Interfaces -A1


1
ไม่แข็งแกร่งมาก ฉันหวังว่าจะมีฟังก์ชั่นเพิ่มเติมในตัวพร้อมตัวเลือกเพื่อรับสิ่งนั้น ตัวอย่างเช่นพฤติกรรมของ 'grep' ในเครื่องที่แตกต่างกันอาจแตกต่างกันทำให้คำสั่ง cut ต่อไปนี้ไม่ถูกต้องเสมอไป
qazwsx

3
ช่วยฉันเข้าใจสิ่งนี้ - คุณไม่รู้ว่าจะทำสิ่งนี้ได้อย่างไรด้วยการทุบตี แต่คุณรู้ว่ามันไม่ "แข็งแกร่ง" เพียงพอ สิ่งที่คุณต้องการทำเพราะตอนนี้คำถามของคุณยังขาดรายละเอียดมากมาย คุณต้องการฟังก์ชั่น "บิวด์อิน"
Allan

แทนการส่งออกท่อของ networksetup -listnetworkserviceorder ก่อนเพื่อ grepจากนั้นไปที่ awkจากนั้นไปที่ cutเพียงใช้ awk สำหรับกระบวนการทั้งหมดเช่น: networksetup -listnetworkserviceorder | awk '{gsub(/\)/, "")}/Wi-Fi, Device/{print $5}'
user3439894
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.