网络插头

网络插头

我正在研究一个 Linux 小工具。

我希望在启动后插入网线或者拔下并重新插入网线时,它能够获得 DHCP。

一个解决方案是运行如下脚本(顺便说一下,它是有效的):

#!/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

然而,我内心深处有一种感觉,告诉我有更好的方法来处理以太网电缆的热插拔事件。

答案1

网络插头

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

答案2

插件很好地处理了这种情况:

ifplugd是一个 Linux 守护进程,当电缆插入时,它将自动配置您的以太网设备,当电缆被拔出时,它将自动取消配置。这对于带有板载网络适配器的笔记本电脑非常有用,因为它只会在电缆真正连接时配置接口。

ifplugd与您的发行版的本机网络配置实用程序交互。

一些特点:

  • 使用您发行版的本机ifup/ifdown程序。
  • [...]
  • 支持 Linux SIOCETHTOOL(较新,又名ethtoolAPI)、SIOCGMIIREG(较旧,又名mii-diag/ mii-toolAPI)和SIOCDEVPRIVATE(最旧,又名mii-toolAPI)ioctl()获取链接状态。版本 0.24 引入了使用IFF_RUNNING接口标志进行链接检测的支持。
  • [...]
  • 可以配置为忽略短暂的“未插电”期(-d选项)或短暂的“插电”期(-u选项)
  • [...]
  • 不支持电缆检测的网络设备的兼容模式(-F可选)

答案3

我建议使用插件超过网插件因为它运行得更好并且得到积极维护。

ifplugd 是一个 Linux 守护进程,当电缆插入时,它将自动配置您的以太网设备,当电缆被拔出时,它将自动取消配置。这对于带有板载网络适配器的笔记本电脑非常有用,因为它只会在电缆真正连接时配置接口。

答案4

使用我的这个软件进行网络配置,非常简单。

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 则很有用)。

与其他软件(如 ifplugd)相比,使用 NCD 的优势在于其设计具有极大的灵活性。它基本上允许您编写自己的网络配置,而不是局限于一组有限的硬编码功能。

更新:我为 BadVPN 和 NCD 制作了 Ubuntu 软件包。我也在 wiki 中更新了 Ubuntu 的安装和使用说明:http://code.google.com/p/badvpn/wiki/NCD#Running_it

相关内容