ตรวจสอบว่าอินเตอร์เฟส eth0 หมด (กำหนดค่า)


30

ฉันต้องตรวจสอบกับสคริปต์ว่าeth0มีการกำหนดค่า ถ้าเป็นเช่นนั้นสคริปต์จะไม่ทำอะไรเลย wlan0มิฉะนั้นก็จะเริ่มต้น (ฉันไม่ต้องการทั้งสองeth0และwlan0จะขึ้นในเวลาเดียวกัน)

อะไรจะเป็นวิธีที่ง่ายที่สุดในการตรวจสอบว่าeth0มีอยู่แล้ว?

ฉันใช้ Debian Wheezy

ชี้แจง:

ฉันต้องการตรวจสอบไม่เพียงแค่eth0เสียบสายเคเบิลแต่ต้องการกำหนดค่าอินเทอร์เฟซ (เช่นมีชุด IP แบบคงที่หรือได้รับ DHCP IP) หากเสียบสายเคเบิล แต่eth0ไม่ได้กำหนดค่าอย่างถูกต้องฉันต้องการเริ่มต้นwlan0


2
ฉันไม่แน่ใจเกี่ยวกับสิ่งที่ฉันจะพูด แต่cat /sys/class/net/ | grep eth0ควรให้ข้อมูลที่แยกวิเคราะห์ได้ง่ายขึ้น คุณสามารถทำได้sudo ethtool eth0 | grep Link
Kiwy

คำตอบ:


45

คุณสามารถทำได้หลายวิธี นี่คือตัวอย่าง:

$ cat /sys/class/net/eth0/operstate
up

5
น่าเสียดายที่สิ่งนี้ไม่รับประกันว่าจะมีการกำหนดค่าอินเทอร์เฟซทั้งหมด คุณสามารถแมว/sys/class/net/eth0/carrierเพื่อตรวจสอบสัญญาณ แต่ก็ยังอาจไม่ได้เช่า DHCP ยัง ฯลฯ
orodbhen

7
ip a show ethX up

หากไม่มีสิ่งใดปรากฏขึ้นแสดงว่าส่วนต่อประสานของคุณไม่ทำงาน


วิธีนี้: "ip ethX แสดงขึ้น" และตรวจสอบสำหรับการส่งออก, ไม่เพียงพอ
โจชัวเคลย์ตัน

5
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

ดังนั้นที่นี่เราgrepเป็นipเครื่องมือที่ใช้กันแพร่หลายstdoutสำหรับบรรทัดที่มีทั้งส่วนติดต่อที่น่าสนใจและวลี"state UP" (ขอบคุณ @Lekensteyn ที่ชี้ให้เห็นถึงความต้องการความเฉพาะเจาะจงมากกว่าเพียงเล็กน้อยUP) เราใช้อาร์กิวเมนต์aเป็นรูปแบบย่อaddressและควรจะเพียงพอที่จะรับรายการการ์ดเครือข่ายที่กำหนดค่าไว้ทั้งหมดในระบบ

ข้อดีอย่างหนึ่งของการใช้งานคือipสามารถใช้งานได้ทุกที่ - เป็นวิธีที่ฉันกำหนดค่าอุปกรณ์เครือข่ายโทรศัพท์ Android ของฉัน

:colonsถูกนำมาใช้เพื่อหลีกเลี่ยงการแข่งขันบางส่วน - ในลักษณะนี้เรารับประกันการแข่งขันeth0เมื่อเทียบกับอย่างอื่นที่เป็นไปได้หรือsomeothereth0eth007

ขอบคุณ @RaphaelAhrens ที่คอยผลักดันฉันไปสู่ความถูกต้องและอธิบายวิธีแก้ปัญหาของฉัน

แก้ไข:

เพื่อจัดการกับข้อกำหนดปัจจุบันคุณสามารถ:

ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'

ข้อมูลด้านบนจะพิมพ์ที่อยู่ IP ของ CIDR หากเป้าหมายของคุณ$ifเป็นUP,เสียบปลั๊กและมีที่อยู่หนึ่งรายการ สำหรับ ipv6 การแก้ปัญหานั้นง่ายเพียงแค่ปรับเปลี่ยนเล็กน้อยเท่านั้น

ถ้าคุณไม่ชอบsedคุณสามารถบรรลุผลที่คล้ายกันกับคนอื่น|pipe ... grepและเพิ่ม-Aตัวเลือกบริบทแรกgrep- sedแต่ผมชอบ


1
คุณควรอธิบายสิ่งที่คุณกำลังทำ เพื่อให้ทุกคนได้ประโยชน์จากคำตอบของคุณ
Raphael Ahrens

5
สิ่งนี้ไม่เพียงพอ การส่งออกนอกจากนี้ยังมีUPกรณีที่อุปกรณ์จะขึ้น 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000แต่ไม่มีสายเคเบิลมีการเชื่อมต่อ: ip addr show dev eth0นอกจากนี้คุณยังสามารถระบุอุปกรณ์ที่จะหลีกเลี่ยงการบวกเท็จ:
Lekensteyn

0

วิธีอื่น ๆ ใช้งานไม่ได้ แต่วิธีนี้ใช้งานได้ (บน Ubuntu อย่างน้อย):

while true; do
    ip route | grep "linkdown"
    if [ $? -eq 0 ]; then
        sleep 1  # network not yet up
    else
        break   # network up
    fi
done

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