Отключить WLan, если доступна проводная / кабельная сеть


39

Вопрос говорит обо всем. Все, что я хочу, - это то, что мое соединение W-Lan должно быть отключено, когда доступно проводное соединение. Какой самый простой способ сделать это в Ubuntu / Gnome?

Во всех руководствах (например, по поводу предположения о сети) я обнаружил, что мне нужно было настроить всю конфигурацию сети (ключи WPA, DHCP, ...), но я считаю, что это слишком сложно для такого простого варианта использования. Я просто хочу отключить wlan0при eth0подключении.


Ответ на этот вопрос варьируется от компьютера к компьютеру. Я не знаю, позволяет ли это Ubuntu, но обычно я обнаружил, что это вариант в BIOS.
Изи

Я не имею completely disableв виду wlan, я имею в виду отключение Ubuntu, чтобы попытаться подключиться к любому wlans, если доступно проводное соединение. Так что это вещь ОС.
Инго Фишер

Ответы:


56

Вы можете оставить этот скрипт /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 (passthrough) и USB-адаптером Ethernet, который я пробовал, и я уверен, что он будет работать и со встроенными адаптерами.


Моя беспроводная связь пыталась подключиться снова и снова, и это становилось действительно раздражающим. Спасибо за этот скрипт, он наконец перестал спрашивать у меня сетевой пароль. Будет ли скрипт автоматически запускаться при перезагрузке компьютера?
Джоэл Лорд

2
@joellord: этот скрипт запускается автоматически при каждом запуске или остановке сетевого интерфейса. Когда вы отключаете eth0, ваша беспроводная сеть включается. Когда вы подключаете eth0, ваша беспроводная сеть отключается.
Phord

1
Солидно - отлично работает и отлично работает минимальный скрипт.
Air

3
С nmcli версии 1.0.2 мне пришлось сменить «nmcli nm wifi» на « nmcli r wifi где rозначает радио»
Алессандро Пеццато

1
Ubuntu 16.04, bash версии 4.3.48, для работы этого скрипта необходимо удалить кавычки.
Карлес Сала

8

Начиная с версии 0.9.10 сетевого менеджера, первый скрипт должен быть изменен

#!/bin/bash

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

Надеюсь, это поможет!


Это, вероятно, может быть отдельным ответом. Очень помогло бы сказать, с какой версией сетевого менеджера произошли эти изменения.
Подмастерье Компьютерщик

Похоже, что с v0.9.10. wiki.gnome.org/Projects/NetworkManager/nmcli
mruellan

1
Это решение не является правильным, так как оно работает, только если ваш интерфейс локальной сети называется «eth0».
Карлес Сала

4

Все просто для подхода GUI гномов ...

  1. Щелкните правой кнопкой мыши индикатор сетевой системы на панели гномов вверх по часам. (Индикатор будет одним из двух значков: либо стрелки вверх / вниз (LAN), либо традиционная воронка WiFi. Обратите внимание, что значок вверх / вниз появится, когда подключены и LAN & WiFi, или только LAN, а воронка WiFi появится, когда подключен ТОЛЬКО через WiFi. (ЛВС отключена)) - [ЛВС автоматически превосходит WiFi. *]

  2. Выберите «Редактировать соединения ...»

  3. Выберите вкладку «Беспроводной».
  4. Дважды щелкните первое соединение в списке и снимите флажок «Подключаться автоматически».
  5. Нажмите кнопку «Применить ...».
  6. Повторите для каждого соединения в списке.

Это оставит беспроводную сеть работоспособной для оперативных ручных подключений и отключений, доступных, если щелкнуть левой кнопкой мыши значок сети, при этом NM не будет пытаться автоматически подключать вас все время.

Естественно, вы также можете отключить / включить беспроводное соединение, щелкнув правой кнопкой мыши значок сети и затем щелкнув левой кнопкой мыши на «Включить беспроводное соединение», что приведет к эффективному отключению или включению беспроводного интерфейса, о чем свидетельствует наличие или отсутствие флажка.

  • Локальная сеть превосходит WiFi автоматически, нет необходимости отключать WiFi. Простое отключение кабеля Ethernet без проблем переведет соединение в Wi-Fi, и вы сможете без проблем и передвигаться. Аналогично с переподключением локальной сети.
  • В то время как ЛВС превосходит WiFi, NM (Network Manager) найдет то, что вам нужно, если вы находитесь в разных сетях одновременно и работаете как в сети (WiFi), так и с локальным хостом (LAN) или V / V, например.

2

Просто предположение, но я предполагаю, что ifplugd может помочь. Вы можете отключить Wi-Fi при использовании кабеля.


Спасибо, я уже читал об этом. Что мне не нравится в ifplugd, так это то, что я должен поместить все свои настройки сети /etc/network/interfaces. Я не очень хорош в сетевых вещах, поэтому мне интересно, где я могу получить все необходимые значения из моих существующих соединений? Все еще надеюсь, что есть более простое решение.
Инго Фишер

1

Создайте два простых «сценария», имя сценария не имеет значения (я просто использую wlan), и я предполагаю, что существует только один интерфейс кабельной сети, и поэтому он называется «eth0» ... Проверьте это с помощью «ifconfig», если вы не уверены. Обратите внимание, что это отключил беспроводную связь полностью, а не только wlan0. (Только проблема, если у вас есть несколько интерфейсов WLAN и вы хотите отключить только определенные)

Эти сценарии можно легко адаптировать - с помощью логической логики - к ситуации, в которой у вас есть два или более кабельных сетевых интерфейса.

Убедитесь, что эти скрипты исполняются с помощью '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

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

Это улучшение предыдущего ответа Сирила Фессла. (Я не имею репутацию комментариев.) Это один работает для Fedora , а также, где в настоящее время сетевые интерфейсы могут иметь имена , как wlan0, wlp6s0, em1и enp0s20u2u1). Этот вариант не пытается сопоставить имя интерфейса, а ищет /sys/class/netинформацию об устройстве. Работает на моем ноутбуке Fedora 21 (ядро 3.18), и я считаю, что он будет работать и на Debian> = 7.

#! / Bin / ш

[$ # -ge 2] || выход 1

DEBUG = ложь
STATEDIR = / вар / запуск / нм-проводной
mkdir -p $ STATEDIR

IFACE = $ 1
ACTION = $ 2

myname = $ (базовое имя "$ 0") || выход 1
log () {logger -p user.info -t "$ {myname} [$$]" "$ IFACE / $ ACTION: $ *"; }

если $ DEBUG; тогда
    if [-e "/ sys / class / net / $ IFACE / device"]; тогда
        журнал "/ sys / class / net / $ IFACE / устройство существует"
    еще
        log "/ sys / class / net / $ IFACE / устройство не существует"
    фи

    if [-e "/ sys / class / net / $ IFACE / wireless"]; тогда
        журнал "/ sys / class / net / $ IFACE / wireless Существует"
    еще
        Журнал "/ sys / class / net / $ IFACE / wireless не существует"
    фи
фи

case $ {ACTION} в
    вверх)
        rm -rf $ STATEDIR / $ IFACE

        # Не делайте ничего, если это не физическое устройство.
        если [ ! -e "/ sys / class / net / $ IFACE / device"]; тогда
            журнал "$ IFACE не физическое устройство - игнорирование"
            выход 0
        фи

        # Не делайте ничего, если это беспроводное устройство.
        if [-d "/ sys / class / net / $ IFACE / wireless"]; тогда
            журнал "$ IFACE не проводное устройство - игнорирование"
            выход 0
        фи

        # Следите за проводными устройствами. Когда они падают,
        # узел устройства также может работать (например, USB-адаптер Ethernet),
        # поэтому у нас не было бы никакой возможности определить тип устройства.
        коснитесь $ STATEDIR / $ IFACE

        # Теперь выключите WiFi.
        журнал "выключение WiFi"
        Nmclir Wi-Fi выключен
        ;;
    вниз)
        # Проверьте, распознали ли мы ранее $ IFACE как
        # физическое, проводное устройство.
        если [ ! -e $ STATEDIR / $ IFACE]; тогда
            журнал "$ IFACE не проводное устройство - игнорирование"
            выход 0
        фи

        rm -rf $ STATEDIR / $ IFACE

        # Вместо того, чтобы проверять один файл, мы могли бы также проверить
        # есть ли еще файлы в $ STATEDIR. Если это так, мы
        # по-прежнему включено проводное устройство ...
        журнал "включение WiFi"
        NMCliR Wi-Fi на
        ;;
ESAC

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=""

Означает ли "закрепленный" подключенный к источнику питания или подключенный к буквальной стыковочной станции / репликатору портов или просто подключенный к чему-либо, обеспечивающему подключение к локальной сети?
dragon788

0

По какой-то причине текущий топовый ответ от derhoch не работает для меня, хотя и должен. Некоторые другие предложения работают, но я хотел чего-то очень простого. Итак, я использую следующий скрипт (который я вставил, /etc/NetworkManager/dispatcher.d/чтобы включить и выключить Wi-Fi в зависимости от eth0статуса).

#! /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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.