Desative WLan se a rede com fio / cabo estiver disponível

39

A questão diz tudo. Tudo o que eu quero é que minha conexão W-Lan seja desativada sempre que uma conexão com fio estiver disponível. Qual seria a maneira mais fácil de fazer isso no Ubuntu / Gnome?

Em todos os guias (por exemplo, alguns sobre o guessnet), descobri que precisava configurar toda a minha configuração de rede (chaves WPA, DHCP, ...), mas acho isso um pouco complicado demais para um caso de uso tão simples. Eu só quero desativar wlan0quando eth0estiver conectado.

Ingo Fischer
fonte
A resposta para esta pergunta varia de computador para computador. Não sei se o Ubuntu permite isso, mas normalmente achei que era uma opção no BIOS.
Iszi 14/01
Não me refiro completely disableà wlan, quero dizer, desabilite o Ubuntu para tentar conectar-se a qualquer wlans se houver uma conexão com fio disponível. Portanto, é uma coisa do sistema operacional.
Ingo Fischer

Respostas:

56

Você pode soltar este script para /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

Não esqueça depois:

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

Isso captura os eth*nomes herdados e as novas "interfaces nomeadas previsíveis" do kernel que começam com ene depois usam o caminho do barramento ou o endereço MAC para que o nome de cada interface seja o mesmo em todas as inicializações. Isso funcionou com o adaptador USB-C (passagem) e ethernet USB com o qual eu tentei e estou confiante de que funcionará também com adaptadores embutidos.

derhoch
fonte
Meu celular estava tentando se conectar de novo e de novo e estava começando a ser realmente irritante. Obrigado por este script, ele finalmente parou de me pedir uma senha de rede. O script será iniciado automaticamente quando eu reiniciar o computador?
Joel Senhor
2
@joellord: Este script é executado automaticamente sempre que uma interface de rede é iniciada ou interrompida. Quando você desconecta o eth0, sua rede sem fio é ativada. Quando você conecta o eth0, sua rede sem fio é desativada.
phord
1
Sólido - funciona perfeitamente e com um script mínimo agradável.
Air
3
Com a versão 1.0.2 nmcli eu tive que mudar `nmcli nm wifi` com nmcli r wifi que ros meios de rádio
Alessandro Pezzato
1
Ubuntu 16.04, bash versão 4.3.48, as aspas precisam ser removidas para que este script funcione.
Carles Sala
8

Desde a v0.9.10 do gerenciador de rede, o primeiro script deve ser modificado

#!/bin/bash

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

Espero que ajude!

mruellan
fonte
Provavelmente, essa pode ser uma resposta independente. Seria útil dizer com que versão do gerenciador de rede essa mudança acontece.
Journeyman Geek
parece ser Desde a v0.9.10. wiki.gnome.org/Projects/NetworkManager/nmcli
mruellan
1
Esta solução não está correta, pois só funciona se a sua interface LAN for chamada "eth0".
Carles Sala
4

Simplesmente para a abordagem GUI do gnome ...

  1. Clique com o botão direito do mouse no indicador do sistema de rede no painel do gnome ao lado do relógio. (O indicador será um dos dois ícones; as setas para cima / para baixo (LAN) ou o funil WiFi tradicional. Observe que o ícone para cima / baixo aparecerá quando LAN e WiFi ou apenas LAN estiverem conectadas e o funil WiFi aparecer quando SOMENTE conectado via WiFi. (LAN desconectada)) - [LAN supera o WiFi automaticamente. *]

  2. Selecione 'Editar conexões ...'

  3. Selecione a guia 'Sem fio'.
  4. Clique duas vezes na primeira conexão da sua lista e desmarque a caixa 'Conectar automaticamente'.
  5. Clique no botão 'Aplicar ...'.
  6. Repita para cada conexão na lista.

Isso deixará a rede sem fio operacional para conexões e desconexões manuais on-the-fly disponíveis, clicando com o botão esquerdo do mouse no ícone de rede, sem que o NM tente conectá-lo automaticamente o tempo todo.

Naturalmente, você também pode desativar / ativar o Wireless clicando com o botão direito do mouse no ícone de rede e, em seguida, clicando com o botão esquerdo na seleção "Ativar Wireless", ativando ou desativando efetivamente a interface Wireless, conforme indicado pela presença ou ausência da marca de seleção.

  • A LAN supera o Wi-Fi automaticamente, não há necessidade de desativar o Wi-Fi. Simplesmente desconectar o cabo Ethernet transfere a conexão para o WiFi sem problemas e você pode pegar e se movimentar sem problemas. Da mesma forma, reconectando a LAN.
  • Enquanto a LAN supera o Wi-Fi, o NM (Network Manager) encontrará o que você procura se estiver em redes diferentes simultaneamente e estiver trabalhando on-line (WiFi) e com um host local (LAN) ou V / V, por exemplo.
rjbradlow
fonte
2

Apenas um palpite, mas presumo que o ifplugd poderia ajudar. Você pode desligá-lo quando o cabo for usado.

ggustafsson
fonte
Obrigado, eu já li sobre isso. O que eu não gosto no ifplugd é que tenho que colocar todas as minhas configurações de rede /etc/network/interfaces. Eu não sou muito bom em coisas de rede, então eu me pergunto onde eu poderia obter todos os valores necessários das minhas conexões existentes? Ainda espero que haja uma solução mais simples.
Ingo Fischer
1

Crie dois 'scripts' simples, o nome do script não é importante (eu simplesmente uso wlan) e suponho que exista apenas uma interface de rede com cabo e, portanto, chame-se 'eth0' ... Verifique isso com 'ifconfig' se você não tenho certeza. Observe que isso desabilitou totalmente o sistema sem fio, não apenas wlan0. (Somente um problema se você tiver várias interfaces wlan e desejar desativar apenas as específicas)

Esses scripts podem ser facilmente adaptados - pela lógica booleana - a uma situação na qual você tem duas ou mais interfaces de rede cabeadas.

Verifique se esses scripts são executáveis ​​com '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

Isso ativa / desativa a conexão sem fio no NetworkManager que geralmente pode ser encontrada como um indicador do sistema no painel Gnome.

Você também pode usar 'ifconfig wlan0 down' ou 'ifconfig wlan0 up' em vez da linha dbus-send, mas isso deve ser mais fácil de usar e interferir menos nos utilitários de sistema do Ubuntu.

Testado com o Ubuntu Desktop 10.10 e deve funcionar com versões anteriores ou outras distribuições usando o NetworkManager e o dbus.

joentjuh
fonte
Isso provavelmente é funcionalmente equivalente às nmcli radio wifi offrespostas aceitas, mas eu ficaria curioso para ver o que os logs do sistema relatam ao fechar as conexões nos dois sentidos para ver se um é mais "gracioso".
dragon788
1

Isso funciona para mim no Debian instável, kernel> 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
Askmeanything
fonte
1

Esta é uma melhoria na resposta anterior de Cyril Fessl. (Eu não tenho a reputação de comentário.) Este funciona para o Fedora, bem como, onde interfaces de rede podem agora ter nomes como wlan0, wlp6s0, em1e enp0s20u2u1). Essa variação não tenta corresponder ao nome da interface, mas procura /sys/class/netinformações sobre o dispositivo. Funciona no meu laptop Fedora 21 (kernel 3.18), e acredito que também funcionará no Debian> = 7.

#! / bin / sh

[$ # -ge 2] || saída 1

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

IFACE = $ 1
AÇÃO = US $ 2

myname = $ (nome da base "$ 0") || saída 1
log () {logger -p usuário.info -t "$ {meu nome} [$$]" "$ IFACE / $ AÇÃO: $ *"; }

se $ DEBUG; então
    se [-e "/ sys / class / net / $ IFACE / dispositivo"]; então
        log "/ sys / class / net / $ IFACE / dispositivo existe"
    outro
        log "/ sys / class / net / $ IFACE / dispositivo não existe"
    fi

    se [-e "/ sys / class / net / $ IFACE / wireless"]; então
        log "/ sys / class / net / $ IFACE / wireless existe"
    outro
        log "/ sys / class / net / $ IFACE / wireless não existe"
    fi
fi

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

        # Não faça nada se este não for um dispositivo físico.
        E se [ ! -e "/ sys / class / net / $ IFACE / dispositivo"]; então
            log "$ IFACE não é um dispositivo físico - ignorando"
            saída 0
        fi

        # Não faça nada se este for um dispositivo sem fio.
        se [-d "/ sys / class / net / $ IFACE / wireless"]; então
            log "$ IFACE não é um dispositivo com fio - ignorando"
            saída 0
        fi

        # Acompanhe os dispositivos com fio. Quando eles caem, o
        # nó do dispositivo também pode ir (por exemplo, dongle Ethernet USB),
        # então não teríamos como dizer que tipo de dispositivo era.
        toque em $ STATEDIR / $ IFACE

        # Agora desligue o WiFi.
        log "desligando o WiFi"
        nmcli r wifi desligado
        ;;
    baixa)
        # Verifique se reconhecemos anteriormente o $ IFACE como um
        # dispositivo físico com fio.
        E se [ ! -e $ STATEDIR / $ IFACE]; então
            log "$ IFACE não é um dispositivo com fio - ignorando"
            saída 0
        fi

        rm -rf $ STATEDIR / $ IFACE

        # Em vez de verificar um único arquivo, também poderíamos verificar
        # se ainda há arquivos em $ STATEDIR. Se sim, nós
        # ainda tem um dispositivo com fio ativado ...
        log "habilitando WiFi"
        nmcli r wifi ligado
        ;;
esac
Steven
fonte
1

Se você já estiver usando o tlp para gerenciamento de energia, ele possui um recurso para fazer isso.

Você precisa modificar seu arquivo 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=""
Luis Cellino
fonte
"Encaixado" significa conectado à energia ou conectado a uma estação de acoplamento literal / replicador de portas ou simplesmente conectado a algo que fornece uma conexão LAN?
dragon788
0

Por qualquer motivo, a principal resposta atual de derhoch não funciona para mim, mesmo que deva. Algumas das outras sugestões funcionam, mas eu queria algo muito simples. Então, eu estou usando o seguinte script (que eu coloco /etc/NetworkManager/dispatcher.d/para ativar e desativar o wifi, dependendo daeth0 do status do).

#! /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

A elsedeclaração é provavelmente desnecessária e pode até ser um problema sob algumas condições, mas deixei lá por precaução (sem essa declaração, se eth0estiver em baixo, ela nunca será exibida).

Andy Forceno
fonte
Qual é a maneira sistemática de fazer isso?
Xofo