我正在研究一个 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
(较新,又名ethtool
API)、SIOCGMIIREG
(较旧,又名mii-diag
/mii-tool
API)和SIOCDEVPRIVATE
(最旧,又名mii-tool
API)ioctl()
获取链接状态。版本 0.24 引入了使用IFF_RUNNING
接口标志进行链接检测的支持。- [...]
- 可以配置为忽略短暂的“未插电”期(
-d
选项)或短暂的“插电”期(-u
选项)- [...]
- 不支持电缆检测的网络设备的兼容模式(
-F
可选)
答案3
答案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