在工作时我可以上网,但只能通过以太网上网。这对于我的笔记本电脑(运行 XUbuntu 13.10 32 位)来说没问题,但对于我的其他设备来说就不是那么好了。所以我要做的就是插入我的笔记本电脑,然后将网络管理器设置为“创建新的 Wi-Fi 网络...”这一切都很好,它让其他设备上网,但我想稍微自动化一下这个过程。
我想要做的是设置一个在启动时运行的 bash 脚本(这部分我可以不借助任何帮助完成)来运行以下伪代码:
While true
If ethernet cable is plugged in and wlan0 is not broadcasting [Foo] signal
- Drop any connection on wlan0
- Create a new Wi-Fi network: [Foo], using WEP key: [bar]
If ethernet cable is unplugged and wlan0 is broadcasting Omni signal
- Stop broadcasting Omni on wlan0
End While
在继续之前,我想说几点。首先,我知道 WEP 不安全,但就我而言,这是必要的,因为其他相关设备无法很好地处理 WPA/WPA2。其次,我也意识到在网络管理器中可能存在一种实现此目的的方法,但我想在 Bash 中实现此目的(不仅是为了使其更容易移植到未来的笔记本电脑上,也是为了了解有关 Bash 脚本的更多信息)
现在回到我们的代码。第一行是最简单的一行:
#!/bin/bash
接下来是我们的循环,让这个脚本在后台运行,以监视以太网连接,每分钟执行一次,以防止我的一个 CPU 过载:
while true; do
# Loop contents to go here
sleep 60
done
现在到了我需要帮助的部分,即检查以太网连接并根据需要创建/销毁 [Foo] 网络的逻辑。为了检查网络连接的状态,我曾短暂地考虑过使用
ifconfig | grep eth0
但是这个输出并没有给我所需的“我是否已连接”信息。如果没有 grep,我可以很好地看到它是否正在运行,但在 Bash 中将其解析为条件又是另一回事。至于使用 ifconfig 而不是网络管理器实际关闭或建立网络,这对我来说也是一个小谜团。关于如何实现此功能有什么想法吗?
与往常一样,提前感谢您的任何建设性意见。
答案1
ifconfig -s <interface>
将打印格式良好(并且易于解析)的输出:
% ifconfig -s enp4s0f2
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
enp4s0f2 1500 0 0 0 0 0 0 0 0 0 BMU
您可以将其传递给 AWK 并根据字段操作管道的退出状态Flg
;存在R
标志表示接口正在运行:
ifconfig -s eth0 | awk 'NR == 2 {if($NF !~ /R/ ) {exit 1}}'
% ifconfig -s
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
enp4s0f2 1500 0 0 0 0 0 0 0 0 0 BMU
lo 65536 0 18990 0 0 0 18990 0 0 0 LRU
wlp3s0f0 1500 0 600316 0 0 0 425756 0 0 0 BMRU
% ifconfig -s enp4s0f2 | awk 'NR == 2{if($NF !~ /R/) {exit 1}}'
1 % ifconfig -s wlp3s0f0 | awk 'NR==2 {if($NF !~ /R/) {exit 1}}'
%
因此测试可能是这样的:
if ifconfig -s eth0 | awk 'NR == 2 {if($NF !~ /R/ ) {exit 1}}'; then
# do the stuff that needs to be done when eth0 is not running
done