Bash wifi/lan 管理

Bash wifi/lan 管理

在工作时我可以上网,但只能通过以太网上网。这对于我的笔记本电脑(运行 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

相关内容