如果有线/有线网络可用,则禁用WLan


39

问题说明了一切。我想要的是只要有可用的有线连接,就应该禁用我的W-Lan连接。在Ubuntu / Gnome中最简单的方法是什么?

在所有指南(例如一些有关guessnet的指南)中,我发现我必须配置整个网络配置(WPA密钥,DHCP等),但是对于这样一个简单的用例,我觉得有点太复杂了。我只想wlan0eth0连接时禁用。


这个问题的答案因计算机而异。我不知道Ubuntu是否允许这样做,但是通常我发现它是BIOS中的一个选项。
Iszi 2011年

我不是说completely disable无线局域网,而是要禁用Ubuntu,以在有线连接可用时尝试连接到任何无线局域网。因此,这是一个操作系统。
Ingo Fischer

Answers:


55

您可以将此脚本放置到/etc/NetworkManager/dispatcher.d/99-wlan

#!/bin/bash
wired_interfaces="en.*|eth.*"
if [[ "$1" =~ $wired_interfaces ]]; then
    case "$2" in
        up)
            nmcli radio wifi off
            ;;
        down)
            nmcli radio wifi on
            ;;
    esac
fi

之后不要忘记:

chmod +x /etc/NetworkManager/dispatcher.d/99-wlan

这将捕获旧eth*名称和以该名称开头的新内核“可预测的命名接口”,en然后使用总线路径或MAC地址,以使每个接口的名称在每次引导时都相同。这可以与我尝试过的USB-C(直通)和USB以太网适配器一起使用,我相信它也可以与内置适配器一起使用。


我的无线设备试图一次又一次地连接,开始变得很烦人。感谢您的脚本,它终于停止向我询问网络密码了。重新启动计算机后,脚本会自动启动吗?
Joel Lord

2
@joellord:每当网络接口启动或停止时,此脚本都会自动运行。断开eth0的连接后,将启用无线功能。当您连接eth0时,您的无线功能将被禁用。
2012年

1
扎实-完美且美观的最小脚本。
航空

3
使用nmcli 1.0.2版时,我不得不更改“ nmcli nm wifi”,nmcli r wifi 其中无线电r意味着
Alessandro Pezzato

1
Ubuntu 16.04,bash版本4.3.48,需要删除引号才能使该脚本正常工作。
卡莱斯·萨拉

8

从网络管理员v0.9.10开始,必须修改第一个脚本

#!/bin/bash

if [ "$1" = "eth0" ]; then
    case "$2" in
        up)
            nmcli radio wifi off
            ;;
        down)
            nmcli radio wifi on
           ;;
   esac
fi

希望能帮助到你!


这可能是一个独立的答案。说出此更改发生在哪个版本的网络管理器中,将大有帮助。
Journeyman Geek


该解决方案是不正确的,因为它仅在您的局域网接口称为“ eth0”时才有效。
卡莱斯·萨拉

4

非常简单的gnome GUI方法...

  1. 在时钟上方,右键单击gnome面板中的网络系统指示器。(指示器将是两个图标之一;向上/向下箭头(LAN)或传统的WiFi漏斗。请注意,当同时连接LAN和WiFi或仅连接LAN时,将显示向上/向下图标,而当仅通过WiFi连接((LAN已断开))-[LAN自动胜过WiFi。*]

  2. 选择“编辑连接...”

  3. 选择“无线”标签。
  4. 双击列表中的第一个连接,然后取消选中“自动连接”框。
  5. 点击“应用...”按钮。
  6. 对列表中的每个连接重复此操作。

左键单击网络图标将使无线网络可进行实时手动连接和断开操作,而NM不会一直尝试自动连接。

当然,您也可以通过右键单击网络图标,然后在“启用无线”选项上单击鼠标左键来禁用/启用无线,从而有效地调低或调高无线接口,如是否存在复选标记所示。

  • LAN自动胜过WiFi,无需禁用WiFi。只需拔下以太网电缆,即可将连接无缝地转移到WiFi,您可以起身走走,而不必大惊小怪。同样,重新连接局域网。
  • 当LAN确实胜过WiFi时,NM(网络管理器)会在同时处于不同网络并且在线(WiFi)并与本地主机(LAN)或V / V一起工作的情况下找到所需内容。

2

只是一个猜测,但我认为ifplugd可以提供帮助。使用电缆时,可以使其关闭wifi。


谢谢,我已经读过了。我不喜欢ifplugd的地方是必须将所有网络设置都放入/etc/network/interfaces。我不是很擅长网络方面的工作,所以我想知道在哪里可以从现有连接中获得所有需要的值?仍然希望有一个更简单的解决方案。
Ingo Fischer,

1

创建两个简单的“脚本”,脚本的名称并不重要(我只是使用wlan),并且假定只有一个有线网络接口,因此称为“ eth0” ...如果您使用“ ifconfig”进行检查不确定。请注意,这会完全禁用无线功能,而不仅仅是wlan0。(只有当您有多个无线接口并且只想禁用特定的无线接口时,这才是一个问题)

通过布尔逻辑,可以轻松地将这些脚本调整为具有两个或更多有线网络接口的情况。

确保这些脚本可以通过“ chmod + x”执行

/etc/network/ip-up.d/wlan

#!/bin/sh
# If eth0 goes up, disable wireless
if [ "$IFACE" = "eth0" ]; then
  dbus-send --system --type=method_call --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.DBus.Properties.Set string:org.freedesktop.NetworkManager string:WirelessEnabled variant:boolean:false
fi

/etc/network/if-down.d/wlan

#!/bin/sh
# If eth0 goes down, enable wireless
if [ "$IFACE" = "eth0" ]; then
  dbus-send --system --type=method_call --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.DBus.Properties.Set string:org.freedesktop.NetworkManager string:WirelessEnabled variant:boolean:true
fi

这可以在NetworkManager中启用/禁用无线功能,通常可以在Gnome面板中找到它作为系统指示器。

您也可以使用'ifconfig wlan0 down'或'ifconfig wlan0 up'代替dbus-send行,但这应该更加用户友好,并且对Ubuntu系统实用程序的干扰也较小。

已在Ubuntu Desktop 10.10上进行了测试,并且可以与使用NetworkManager和dbus的早期版本或其他发行版一起使用。


这在功能上可能等效于已接受的nmcli radio wifi off答案,但是我很想知道在关闭连接的两种方式下系统日志报告的内容,以查看是否更“优雅”。
dragon788 '17

1

这在Debian不稳定的内核中对我有效,内核> 3.17

#!/bin/sh
myname=$(basename "$0") || exit 1
log() { logger -p user.info -t "${myname}[$$]" "$*"; }
IFACE=$1
ACTION=$2

case ${IFACE} in
    eth*|usb*)
        case ${ACTION} in
            up)
                nmcli r wifi off
                ;;
            down)
                nmcli r wifi on
                ;;
        esac
        ;;
esac

1

这是对Cyril Fessl先前答案的改进。(我没有信誉评论。)这一个作品的Fedora以及,其中网络接口现在能有这样的名字wlan0wlp6s0em1enp0s20u2u1)。此变体不会尝试匹配接口名称,而是/sys/class/net在设备上查找信息。可在我的Fedora 21笔记本电脑(内核3.18)上运行,并且我相信它也可以在Debian> = 7上运行。

#!/ bin / sh

[$#-ge 2] || 1号出口

DEBUG =假
STATEDIR = / var / run / nm-wired
mkdir -p $ STATEDIR

IFACE = $ 1
动作= $ 2

myname = $(基本名“ $ 0”)|| 1号出口
log(){logger -p user.info -t“ $ {myname} [$$]”“ $ IFACE / $ ACTION:$ *”; }

如果$ DEBUG; 然后
    如果[-e“ / sys / class / net / $ IFACE / device”];然后
        日志“ / sys / class / net / $ IFACE /设备存在”
    其他
        日志“ / sys / class / net / $ IFACE /设备不存在”
    科幻

    如果[-e“ / sys / class / net / $ IFACE / wireless”];然后
        日志“ / sys / class / net / $ IFACE /无线存在”
    其他
        日志“ / sys / class / net / $ IFACE /无线不存在”
    科幻
科幻

案例$ {ACTION}
    上)
        rm -rf $ STATEDIR / $ IFACE

        #如果这不是物理设备,请勿执行任何操作。
        如果[!-e“ / sys / class / net / $ IFACE / device”]; 然后
            日志“ $ IFACE不是物理设备-忽略”
            出口0
        科幻

        #如果这是无线设备,请勿执行任何操作。
        如果[-d“ / sys / class / net / $ IFACE / wireless”];然后
            日志“ $ IFACE不是有线设备-忽略”
            出口0
        科幻

        #跟踪有线设备。当他们下去时,
        #设备节点也可以运行(例如USB以太网加密狗),
        #因此我们无法得知设备的类型。
        触摸$ STATEDIR / $ IFACE

        #现在关闭WiFi。
        记录“关闭WiFi”
        nmcli r wifi已关闭
        ;;
    下)
        #检查我们之前是否将$ IFACE识别为
        #物理有线设备。
        如果[!-e $ STATEDIR / $ IFACE]; 然后
            日志“ $ IFACE不是有线设备-忽略”
            出口0
        科幻

        rm -rf $ STATEDIR / $ IFACE

        #除了检查单个文件,我们还可以检查
        #$ STATEDIR中是否仍然有文件。如果是这样,我们
        #仍启用有线设备...
        记录“启用WiFi”
        开启nmcli r wifi
        ;;
埃萨克

1

如果您已经使用tlp进行电源管理,则它具有执行此功能的功能。

您必须修改conf文件(/ etc / default / tlp)

# Radio devices to enable/disable when docked.
#DEVICES_TO_ENABLE_ON_DOCK=""
DEVICES_TO_DISABLE_ON_DOCK="wifi wwan"

# Radio devices to enable/disable when undocked.
DEVICES_TO_ENABLE_ON_UNDOCK="wifi"
#DEVICES_TO_DISABLE_ON_UNDOCK=""

“对接”是指插入电源或插入字面上的扩展坞/端口复制器,还是仅插入提供LAN连接的设备?
dragon788 '17

0

不管出于什么原因,derhoch提出的当前最佳答案对我来说都行不通,尽管它应该适用。其他一些建议确实可行,但是我想要一些非常简单的建议。因此,我正在使用以下脚本(/etc/NetworkManager/dispatcher.d/根据eth0的状态插入了该脚本以打开和关闭wifi 。

#! /bin/bash
# Enable/disable wlan0 depending on eth0 and wlan0 current state

eth0_status=$(cat /sys/class/net/eth0/operstate)
wlan0_status=$(cat /sys/class/net/wlan0/operstate)

if [[ "$eth0_status" = "up" ]];
    then
        nmcli nm wifi off
elif [[ "$wlan0_status" = "down" ]] && [[ "$eth0_status" = "down" ]];
    then
        nmcli nm wifi on
else 
    nmcli nm eth0 on
    nmcli nm wlan0 off

fi

else语句可能是不必要的,甚至在某些情况下甚至可能是个问题,但我留在这里只是为了以防万一(如果没有该语句,则该语句eth0将不会出现)。


有什么系统的方法可以做到这一点?
Xofo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.