Deshabilite WLan si la red cableada / por cable está disponible

39

La pregunta lo dice todo. Todo lo que quiero es que mi conexión W-Lan se desactive siempre que haya una conexión por cable disponible. ¿Cuál sería la forma más fácil de hacer eso en Ubuntu / Gnome?

En todas las guías (por ejemplo, algunas sobre guessnet) descubrí que tenía que configurar toda mi configuración de red (claves WPA, DHCP, ...), pero me parece un poco demasiado complicado para un caso de uso tan simple. Solo quiero deshabilitar wlan0cuando eth0está conectado.

Ingo Fischer
fuente
La respuesta a esta pregunta varía de computadora a computadora. No sé si Ubuntu lo permite, pero normalmente he encontrado que es una opción en el BIOS.
Iszi
No me refiero completely disableal wlan, me refiero a desactivar Ubuntu para intentar conectarse a cualquier wlans si hay una conexión por cable disponible. Entonces es una cosa del sistema operativo.
Ingo Fischer

Respuestas:

56

Puede soltar este script en /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

No olvides después:

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

Esto captura los eth*nombres heredados y las nuevas "interfaces con nombre predecibles" del núcleo que comienzan con eny luego usan la ruta del bus o la dirección MAC para que el nombre de cada interfaz sea el mismo en cada arranque. Esto funcionó con el adaptador USB-C (passthrough) y USB ethernet con el que probé y estoy seguro de que también funcionará con adaptadores incorporados.

derhoch
fuente
Mi conexión inalámbrica intentaba conectarse una y otra vez y estaba empezando a ser realmente irritante. Gracias por este script, finalmente dejó de pedirme una contraseña de red. ¿El script se iniciará automáticamente cuando reinicie mi computadora?
Joel Lord
2
@joellord: este script se ejecuta automáticamente cada vez que se inicia o se detiene una interfaz de red. Cuando desconecta eth0, su conexión inalámbrica se habilita. Cuando conecta eth0, su conexión inalámbrica se desactiva.
Phord
1
Sólido: funciona perfectamente y tiene un guión minimalista agradable.
Aire
3
Con nmcli versión 1.0.2 tuve que cambiar `nmcli nm wifi` con nmcli r wifi where rsignifica radio
Alessandro Pezzato
1
Ubuntu 16.04, bash versión 4.3.48, las comillas deben eliminarse para que este script funcione.
Carles Sala
8

Desde la v0.9.10 de network-manager, se debe modificar el primer script

#!/bin/bash

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

¡Espero eso ayude!

mruellan
fuente
Esto probablemente puede ser una respuesta independiente. Sería de gran ayuda decir con qué versión del administrador de red ocurre este cambio.
Journeyman Geek
parece ser desde v0.9.10. wiki.gnome.org/Projects/NetworkManager/nmcli
mruellan
1
Esta solución no es correcta, ya que solo funciona si su interfaz lan se llama "eth0".
Carles Sala
4

Simplemente para el enfoque gnome GUI ...

  1. Haga clic derecho en el indicador del sistema de red en el panel de gnomos junto a su reloj. (El indicador será uno de los dos íconos; ya sea las flechas arriba / abajo (LAN) o el embudo WiFi tradicional. Tenga en cuenta que el ícono arriba / abajo aparecerá cuando LAN y WiFi o solo LAN estén conectadas y el embudo WiFi aparece cuando conectado a través de WiFi SOLAMENTE. (LAN desconectada)) - [LAN supera a WiFi automáticamente. *]

  2. Seleccione 'Editar conexiones ...'

  3. Seleccione la pestaña 'Inalámbrico'.
  4. Haga doble clic en la primera conexión de su lista y desactive la casilla 'Conectar automáticamente'.
  5. Haga clic en el botón 'Aplicar ...'.
  6. Repita para cada conexión en la lista.

Esto dejará la red inalámbrica operativa para conexiones y desconexiones manuales sobre la marcha disponibles haciendo clic izquierdo en el icono de red, sin que NM intente conectarse automáticamente todo el tiempo.

Naturalmente, también podría deshabilitar / habilitar la conexión inalámbrica haciendo clic con el botón derecho en el ícono de red y luego haciendo clic con el botón izquierdo en la selección "Habilitar conexión inalámbrica", bajando o subiendo la interfaz inalámbrica como indica la presencia o ausencia de la marca de verificación.

  • LAN supera a WiFi automáticamente, no hay necesidad de desactivar WiFi. Simplemente desconectando su cable Ethernet transferirá sin problemas la conexión a WiFi y usted puede recoger y moverse sin ningún problema. Del mismo modo, con la reconexión de la LAN.
  • Si bien LAN supera a WiFi, NM (Network Manager) encontrará lo que busca si está en diferentes redes simultáneamente y está trabajando tanto en línea (WiFi) como con un host local (LAN) o V / V, por ejemplo.
rjbradlow
fuente
2

Solo una suposición, pero supongo que ifplugd podría ayudar. Puede hacer que apague el wifi cuando se usa el cable.

ggustafsson
fuente
Gracias, ya leí sobre eso. Lo que no me gusta de ifplugd es que tengo que poner toda mi configuración de red /etc/network/interfaces. No soy muy bueno en las redes, así que me pregunto dónde podría obtener todos los valores necesarios de mis conexiones existentes. Todavía espero que haya una solución más simple.
Ingo Fischer
1

Cree dos 'scripts' simples, el nombre del script no es importante (simplemente uso wlan) y supongo que solo hay una interfaz de red cableada, por lo que se llama 'eth0' ... Verifique esto con 'ifconfig' si No estoy seguro. Tenga en cuenta que esto deshabilitó la conexión inalámbrica por completo, no solo wlan0. (Solo es un problema si tiene varias interfaces wlan y solo desea desactivar las específicas)

Estos scripts podrían adaptarse fácilmente, por lógica booleana, a una situación en la que tenga dos o más interfaces de red cableadas.

Asegúrese de que estos scripts sean ejecutables con '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

Esto habilita / deshabilita la conexión inalámbrica en el NetworkManager que generalmente se puede encontrar como un indicador del sistema en el panel Gnome.

También puede usar 'ifconfig wlan0 down' o 'ifconfig wlan0 up' en lugar de la línea dbus-send, pero esto debería ser más fácil de usar e interferir menos con las utilidades del sistema de Ubuntu.

Probado con Ubuntu Desktop 10.10, y debería funcionar con versiones anteriores u otras distribuciones usando NetworkManager y dbus.

joentjuh
fuente
Probablemente sea funcionalmente equivalente a las nmcli radio wifi offrespuestas aceptadas, pero me gustaría ver qué informan los registros del sistema al cerrar las conexiones en ambos sentidos para ver si una es más "elegante".
dragon788
1

Esto funciona para mí en Debian inestable, 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
Pregúntame lo que sea
fuente
1

Esta es una mejora en la respuesta anterior de Cyril Fessl. (No tengo la reputación de sus comentarios.) Esta funciona para Fedora también, donde las interfaces de red ahora pueden tener nombres como wlan0, wlp6s0, em1y enp0s20u2u1). Esta variación no intenta coincidir con el nombre de la interfaz, sino que busca /sys/class/netinformación en el dispositivo. Funciona en mi computadora portátil Fedora 21 (kernel 3.18), y creo que también funcionará en Debian> = 7.

#! / bin / sh

[$ # -ge 2] || salida 1

DEPURACIÓN = falso
STATEDIR = / var / run / nm-wired
mkdir -p $ STATEDIR

IFACE = $ 1
ACCIÓN = $ 2

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

si $ DEBUG; luego
    if [-e "/ sys / class / net / $ IFACE / device"]; luego
        log "/ sys / class / net / $ IFACE / device exist"
    más
        log "/ sys / class / net / $ IFACE / device no existe"
    fi

    if [-e "/ sys / class / net / $ IFACE / wireless"]; luego
        log "/ sys / class / net / $ IFACE / wireless existe"
    más
        log "/ sys / class / net / $ IFACE / wireless no existe"
    fi
fi

case $ {ACTION} en
    arriba)
        rm -rf $ STATEDIR / $ IFACE

        # No haga nada si este no es un dispositivo físico.
        Si [ ! -e "/ sys / class / net / $ IFACE / device"]; luego
            log "$ IFACE no es un dispositivo físico - ignorando"
            salida 0
        fi

        # No haga nada si se trata de un dispositivo inalámbrico.
        if [-d "/ sys / class / net / $ IFACE / wireless"]; luego
            log "$ IFACE no es un dispositivo con cable - ignorando"
            salida 0
        fi

        # Realizar un seguimiento de los dispositivos con cable. Cuando bajan, el
        # el nodo del dispositivo también puede funcionar (por ejemplo, un dongle USB Ethernet),
        # así que no tendríamos forma de saber de qué tipo era el dispositivo.
        toque $ STATEDIR / $ IFACE

        # Ahora apague el WiFi.
        registro "apagar WiFi"
        nmcli r wifi apagado
        ;;
    abajo)
        # Compruebe si previamente reconocimos $ IFACE como un
        # dispositivo físico con cable.
        Si [ ! -e $ STATEDIR / $ IFACE]; luego
            log "$ IFACE no es un dispositivo con cable - ignorando"
            salida 0
        fi

        rm -rf $ STATEDIR / $ IFACE

        # En lugar de verificar un solo archivo, también podríamos verificar
        # si todavía hay archivos en $ STATEDIR. Si es así, nosotros
        # todavía tiene un dispositivo con cable habilitado ...
        registro "habilitar WiFi"
        nmcli r wifi en
        ;;
esac
Steven
fuente
1

Si ya está utilizando tlp para la administración de energía, tiene una función para hacerlo.

Tiene que modificar su archivo 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
fuente
¿"Atracado" significa enchufado a la alimentación o enchufado a una estación de acoplamiento literal / replicador de puerto o simplemente enchufado a algo que proporciona una conexión LAN?
dragon788 19/0717
0

Por alguna razón, la respuesta principal actual de derhoch no funciona para mí, aunque debería. Algunas de las otras sugerencias funcionan, pero quería algo muy simple. Por lo tanto, estoy usando el siguiente script (que puse /etc/NetworkManager/dispatcher.d/para activar y desactivar wifi dependiendo del eth0estado de.

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

La elsedeclaración es probablemente innecesaria, e incluso podría ser un problema en algunas condiciones, pero la dejé allí por si acaso (sin esa declaración, si eth0está desactivada, nunca aparece).

Andy Forceno
fuente
¿Cuál es la forma systemd de hacer esto?
Xofo