Як налаштувати `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

Однак у мене в маленькому пальці ноги є відчуття, яке підказує мені, що є кращий спосіб впоратися з подіями гарячої розетки для кабелю Ethernet.


1
На жаль, станом на 2016 рік і те, ifplugdі netplugdздається, незакінченим. Однак схоже на це питання, схоже, що він має добрий (простий) відповідь, використовуючи правила udev - додатковий пакет не потрібен. serverfault.com/a/312296/275255
Том Ніколс

Зміна autoдо allow-hotplugв interfaces.
Кен Шарп

Відповіді:


9

сітчастий штекер

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, який автоматично налаштує ваш мережевий пристрій під час підключення кабелю і автоматично відключить його, якщо кабель підтягнуто. Це корисно на ноутбуках із вбудованими мережевими адаптерами, оскільки він налаштує інтерфейс лише тоді, коли кабель справді підключений.

ifplugd інтерфейси з утилітами конфігурації рідної мережі вашого дистрибутива.

Деякі функції:

  • Використовує рідні ifup/ ifdownпрограми вашого розповсюдження .
  • [...]
  • Підтримує Linux SIOCETHTOOL(новіший, aka ethtoolAPI), SIOCGMIIREG(старший, aka mii-diag/ mii-toolAPI) та SIOCDEVPRIVATE(найдавніший, aka mii-toolAPI) ioctl()s для отримання статусу посилання. У випуску 0.24 представлена ​​підтримка виявлення посилань із IFF_RUNNINGпрапором інтерфейсу.
  • [...]
  • Можна налаштувати на ігнорування коротких періодів "відключення" ( -dопція) або коротких "підключених" періодів ( -uопція)
  • [...]
  • Режим сумісності для мережевих пристроїв, які не підтримують виявлення кабелю ( -Fопція)

Мій місцевий LUG скеровував мене netplug, тому я пішов із цим. Дякую!
CoolAJ86

Це зробило для мене хитрість одним застереженням. Якщо netplugdввімкнено, я виявив, що мені довелося видалити auto <interface>з /etc/network/interfaces. Якщо ні, мені довелося підключити кабель Ethernet, вийняти його та підключити ще раз, перш ніж я отримав IP-адресу від DHCP. Якщо цей рядок видалений, я отримую IP-адресу від DHCP під час першого події плагіну або під час завантаження, якщо кабель вже був підключений (IP при завантаженні працював із або без вилученої лінії при ifplugdвключенні).
МістерМас

5

Я б запропонував використовувати ifplugd через netplugd, оскільки він працює краще і активно підтримується.

ifplugd - демон Linux, який автоматично налаштує ваш мережевий пристрій під час підключення кабелю та автоматично відключить його, якщо кабель підтягнуто. Це корисно на ноутбуках із вбудованими мережевими адаптерами, оскільки він налаштує інтерфейс лише тоді, коли кабель справді підключений.


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, полягає в тому, що його дизайн забезпечує велику гнучкість. Це в основному дозволяє програмувати власну мережеву конфігурацію, на відміну від обмеженого набору можливостей з жорстким кодом.

ОНОВЛЕННЯ: Я створив пакети Ubuntu для BadVPN та NCD. Я оновив вікі з інструкціями щодо встановлення та використання для Ubuntu також: http://code.google.com/p/badvpn/wiki/NCD#Running_it


Це дійсно виглядає корисно, ви думаєте, що ви потрапите в репост Ubuntu / Fedora?
CoolAJ86

В даний час у мене є пакети для Arch та Gentoo, і більше нічого, тому що я не використовую інші дистрибутиви. Я можу знайти якийсь час, щоб скласти пакунки для інших дистрибутивів. Однак легко просто скомпілювати та встановити його в / usr / local або щось подібне, і створити простий скрипт для його запуску.
Ambroz Bizjak

Пакети Ubuntu виконані, за вашим запитом :)
Ambroz Bizjak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.