วิธีการกำหนดค่า `eth0 'ให้ลองใหม่' dhclient` เมื่อถอดปลั๊กและเสียบใหม่แล้ว?


12

ฉันกำลังทำงานกับอุปกรณ์ linux

ฉันต้องการให้รับ DHCP ถ้าฉันเสียบสายเคเบิลเครือข่ายหลังจากบูตขึ้นแล้วหรือหากถอดสายเคเบิลเครือข่ายออกแล้วเสียบใหม่

ทางออกหนึ่งคือการเรียกใช้สคริปต์เช่นนี้ (ซึ่งใช้งานได้ btw):

#!/bin/bash

NET_STATUS='different'

while true
do
  NEW_NET_STATUS=`ifconfig | grep RUNNING | grep -v LOOPBACK`
  if [ "${NEW_NET_STATUS}" = "${NET_STATUS}" ]
  then
    echo "no change"
    sleep 1
    continue
  fi
  NET_STATUS=${NEW_NET_STATUS}
  if [ "${NET_STATUS}" ]
  then
    echo "cable plugged in"
  else
    echo "cable unplugged"
  fi
  sleep 1
done

อย่างไรก็ตามฉันรู้สึกลึกลงไปในนิ้วเท้าเล็ก ๆ ของฉันที่บอกฉันว่ามีวิธีที่ดีกว่าในการจัดการกับเหตุการณ์ hotplug สำหรับสายเคเบิลอีเธอร์เน็ต


1
น่าเสียดายที่ตั้งแต่ปี 2016 ทั้งคู่ifplugdและnetplugdดูเหมือนไร้ผู้ดูแล อย่างไรก็ตามคำถามที่คล้ายกันนี้ดูเหมือนว่าจะมีคำตอบที่ดี (ง่าย) โดยใช้กฎ udev - ไม่จำเป็นต้องมีแพ็คเกจเพิ่มเติม serverfault.com/a/312296/275255
Thom Nichols

เปลี่ยนautoไปในallow-hotplug interfaces
เคนคม

คำตอบ:


9

netplug

netplugเป็นทางออกที่ฉันไปด้วย ifplugdอาจทำงานได้เช่นกัน

การติดตั้ง

sudo apt-get install netplug

การกำหนดค่าส่วนต่อประสาน

cat /etc/netplug/netplugd.conf
eth*

การกำหนดค่าเหตุการณ์

cat /etc/netplug/netplug
#!/bin/sh
PATH=/usr/bin:/bin:/usr/sbin:/sbin
export PATH

dev="$1"
action="$2"

case "$action" in
in)
    echo "$dev : $action : plugged in" >> /tmp/netplug.log
    ;;
out)
    echo "$dev : $action : unplugged" >> /tmp/netplug.log
    ;;
probe)
    echo "$dev : $action : probed" >> /tmp/netplug.log
    ;;
*)
    echo "$dev : $action : I feel violated" >> /tmp/netplug.log
    exit 1
    ;;
esac

การทดสอบ

/etc/init.d/netplug stop
/etc/init.d/netplug start

cat /tmp/netplug.log
eth0 : probe : probed
eth1 : probe : probed
...
eth15 : probe : probed
eth0 : in : plugged in

5

ifplugdจัดการกับสถานการณ์นี้ได้เป็นอย่างดี:

ifplugdเป็น Linux daemon ซึ่งจะกำหนดค่าอุปกรณ์อีเธอร์เน็ตของคุณโดยอัตโนมัติเมื่อต่อสายเคเบิลและยกเลิกการกำหนดค่าโดยอัตโนมัติหากดึงสายเคเบิล สิ่งนี้มีประโยชน์สำหรับแล็ปท็อปที่มีอะแดปเตอร์เครือข่ายออนบอร์ดเนื่องจากจะกำหนดค่าอินเทอร์เฟซเฉพาะเมื่อเชื่อมต่อสายเคเบิลจริงๆ

ifplugd อินเตอร์เฟสกับยูทิลิตี้ตั้งค่าเครือข่ายดั้งเดิมของการแจกจ่าย

คุณสมบัติบางอย่าง:

  • ใช้พื้นเมืองifup/ ifdownโปรแกรมการกระจายของคุณ
  • [ ... ]
  • รองรับ Linux SIOCETHTOOL(ใหม่กว่า, aka ethtoolAPI), SIOCGMIIREG(เก่ากว่า, aka mii-diag/ mii-toolAPI) และSIOCDEVPRIVATE(เก่าที่สุด, aka mii-tool) API ioctl()สำหรับรับสถานะลิงก์ Release 0.24 แนะนำการสนับสนุนสำหรับการตรวจจับลิงก์ด้วยการIFF_RUNNINGตั้งค่าสถานะอินเตอร์เฟส
  • [ ... ]
  • สามารถกำหนดค่าให้ละเว้นจุด "unplugged" แบบสั้น ( -dตัวเลือก) หรือจุดแบบ "เสียบ" แบบสั้น ( -uตัวเลือก)
  • [ ... ]
  • โหมดความเข้ากันได้สำหรับอุปกรณ์เครือข่ายที่ไม่รองรับการตรวจจับสายเคเบิล ( -Fตัวเลือก)

LUG ในพื้นที่ของฉันสั่งnetplugให้ฉันไปฉันจึงไปกับสิ่งนั้นแทน ขอบคุณ!
CoolAJ86

นี่เป็นการหลอกลวงสำหรับฉันโดยมีข้อแม้หนึ่งข้อ ด้วยการnetplugdเปิดการใช้งานผมพบว่าผมต้องเอาจากauto <interface> /etc/network/interfacesถ้าไม่ฉันต้องเสียบสาย Ethernet ถอดออกแล้วเสียบใหม่อีกครั้งก่อนที่ฉันจะได้รับที่อยู่ IP จาก DHCP เมื่อนำบรรทัดนี้ออกฉันจะได้รับที่อยู่ IP จาก DHCP ในเหตุการณ์ปลั๊กอินแรกหรือเมื่อบู๊ตหากสายเคเบิลถูกเสียบไว้แล้ว (IP เมื่อบูตทำงานด้วยหรือไม่ใช้สายที่ถอดออกเมื่อifplugdเปิดใช้งาน)
MrMas

5

ฉันอยากจะแนะนำให้ใช้ifplugdมากกว่าnetplugdเพราะมันใช้งานได้ดีขึ้นและได้รับการบำรุงรักษาอย่างแข็งขัน

ifplugd เป็น Linux daemon ซึ่งจะกำหนดค่าอุปกรณ์อีเธอร์เน็ตของคุณโดยอัตโนมัติเมื่อเสียบสายเคเบิลและยกเลิกการกำหนดค่าโดยอัตโนมัติหากดึงสายเคเบิล สิ่งนี้มีประโยชน์สำหรับแล็ปท็อปที่มีอะแดปเตอร์เครือข่ายออนบอร์ดเนื่องจากจะกำหนดค่าอินเทอร์เฟซเฉพาะเมื่อเชื่อมต่อสายเคเบิลจริงๆ


2

การใช้ซอฟต์แวร์ของฉันนี้เพื่อการกำหนดค่าเครือข่ายนั้นง่ายมาก

http://code.google.com/p/badvpn/wiki/NCD

โปรแกรม NCD ต่อไปนี้จะทำ นอกจากนี้ยังแสดงวิธีที่คุณสามารถขยายการกำหนดค่าในกรณีนี้โดยการเรียกใช้บางอย่างเมื่อเครือข่ายขึ้น / ลง

process eth0 {
    # Set device.
    var("eth0") dev;

    # Wait for device to appear, set it up, and wait for cable to be plugged in.
    net.backend.waitdevice(dev);
    net.up(dev);
    net.backend.waitlink(dev);

    # DHCP configuration.
    # net.ipv4.dhcp() will block here until it obtaines an IP address.
    # It doesn't check the obtained address in any way,
    # so as a basic security measure, do not proceed if it is local.
    net.ipv4.dhcp(dev) dhcp;
    ip_in_network(dhcp.addr, "127.0.0.0", "8") test_local;
    ifnot(test_local);

    # Assign IP address to interface, as obtained by DHCP.
    net.ipv4.addr(dev, dhcp.addr, dhcp.prefix);

    # Add default route.
    net.ipv4.route("0.0.0.0", "0", dhcp.gateway, "20", dev);

    # Add DNS servers.
    net.dns(dhcp.dns_servers, "20");

    # Run an external program when network comes up or goes down.
    list("/some/program/to/run/when/up", "argument") do;
    list("/some/program/to/run/when/down", "argument") undo;
    run(do, undo);
}

โปรดทราบว่าสิ่งนี้จะไม่เพียง แต่จัดการกับสายเคเบิลเครือข่ายที่ถูกเสียบเข้าหรือออก แต่ยังรวมถึงส่วนต่อประสานเครือข่ายที่ปรากฏและหายไปเอง (มีประโยชน์หากเป็น USB)

ข้อดีของการใช้ NCD เมื่อเทียบกับซอฟต์แวร์อื่น ๆ เช่น ifplugd คือการออกแบบที่ให้ความยืดหยุ่นที่ดีเยี่ยม โดยทั่วไปจะช่วยให้คุณสามารถตั้งโปรแกรมกำหนดค่าเครือข่ายของคุณเองซึ่งแตกต่างจากการจำกัดความสามารถของฮาร์ดโค้ด

UPDATE: ฉันได้สร้างแพ็คเกจ Ubuntu สำหรับ BadVPN และ NCD แล้ว ฉันได้อัปเดตวิกิด้วยคำแนะนำในการติดตั้งและการใช้งานสำหรับ Ubuntu ด้วย: http://code.google.com/p/badvpn/wiki/NCD#Running_it


สิ่งนี้ดูมีประโยชน์จริง ๆ คุณคิดว่าคุณจะเอามันลงใน repos ของ Ubuntu / Fedora หรือไม่?
CoolAJ86

ปัจจุบันฉันมีแพ็คเกจสำหรับ Arch และ Gentoo และไม่มีอะไรอื่นเพราะฉันไม่ได้ใช้ distros อื่น ฉันอาจหาเวลาทำแพ็คเกจสำหรับ distros อื่น ๆ อย่างไรก็ตามมันเป็นเรื่องง่ายที่จะคอมไพล์และติดตั้งลงใน / usr / local หรือบางอย่างและสร้างสคริปต์เริ่มต้นง่ายๆเพื่อเริ่มใช้งาน
Ambroz Bizjak

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