38

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

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

9 ответов9

52

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

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

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

4

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

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

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

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

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

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

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

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

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

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

#!/bin/sh

[ $# -ge 2 ] || exit 1

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

IFACE=$1
ACTION=$2

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

if $DEBUG; then
    if [ -e "/sys/class/net/$IFACE/device" ]; then
        log "/sys/class/net/$IFACE/device exists"
    else
        log "/sys/class/net/$IFACE/device does not exist"
    fi

    if [ -e "/sys/class/net/$IFACE/wireless" ]; then
        log "/sys/class/net/$IFACE/wireless exists"
    else
        log "/sys/class/net/$IFACE/wireless does not exist"
    fi
fi

case ${ACTION} in
    up)
        rm -rf $STATEDIR/$IFACE

        # Don't do anything if this is not a physical device.
        if [ ! -e "/sys/class/net/$IFACE/device" ]; then
            log "$IFACE not a physical device -- ignoring"
            exit 0
        fi

        # Don't do anything if this is a wireless device.
        if [ -d "/sys/class/net/$IFACE/wireless" ]; then
            log "$IFACE not a wired device -- ignoring"
            exit 0
        fi

        # Keep track of wired devices. When they go down, the
        # device node may go as well (e.g. USB Ethernet dongle),
        # so we'd have no way of telling what type the device was.
        touch $STATEDIR/$IFACE

        # Now shut down WiFi.
        log "shutting down WiFi"
        nmcli r wifi off
        ;;
    down)
        # Check whether we previously recognised $IFACE as a
        # physical, wired device.
        if [ ! -e $STATEDIR/$IFACE ]; then
            log "$IFACE not a wired device -- ignoring"
            exit 0
        fi

        rm -rf $STATEDIR/$IFACE

        # Instead of checking a single file, we could also check
        # whether there are still files in $STATEDIR. If so, we
        # still have a wired device enabled...
        log "enabling WiFi"
        nmcli r wifi on
        ;;
esac
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.

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
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 не работает, он никогда не появится).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .