Automatically switch between WiFi and Ethernet
I wanted a way to automatically switch between wifi and ethernet when I connect the system to the ethernet port, or auto start wifi when I disconnect the ethernet port.
Simplest way to do so was to use NetworkManager to enable/disable wifi, when we detect an ethernet connection.
I also wanted a way to track what is happening so we log to syslog our actions, and a way to disable the functionality without removing the file from they system.
Open up your favorite editor and create the file bellow with the contents.
/etc/NetworkManager/dispatcher.d/70-wifi-wired-exclusive.sh
#!/usr/bin/env bash
name_tag="wifi-wired-exclusive"
syslog_tag="$name_tag"
skip_filename="/etc/NetworkManager/.$name_tag"
if [ -f "$skip_filename" ]; then
exit 0
fi
interface="$1"
iface_mode="$2"
iface_type=$(nmcli dev | grep "$interface" | tr -s ' ' | cut -d' ' -f2)
iface_state=$(nmcli dev | grep "$interface" | tr -s ' ' | cut -d' ' -f3)
logger -i -t "$syslog_tag" "Interface: $interface = $iface_state ($iface_type) is $iface_mode"
enable_wifi() {
logger -i -t "$syslog_tag" "Interface $interface ($iface_type) is down, enabling wifi ..."
nmcli radio wifi on
}
disable_wifi() {
logger -i -t "$syslog_tag" "Disabling wifi, ethernet connection detected."
nmcli radio wifi off
}
if [ "$iface_type" = "ethernet" ] && [ "$iface_mode" = "down" ]; then
enable_wifi
elif [ "$iface_type" = "ethernet" ] && [ "$iface_mode" = "up" ] && [ "$iface_state" = "connected" ]; then
disable_wifi
fi
If we want to disable this script, instead of deleting it we can just do
touch /etc/NetworkManager/.wifi-wired-exclusive
And this will skip the script everytime it’s invoked.
And here are some details from the syslog, as you can see it turns off the wifi if there is an ethernet connection on the system, and turn on the wifi if the ethernet connection is disabled.
Dec 20 22:47:13 x1 wifi-wired-exclusive[7980]: Interface: enx0050b6c0408e = connected (ethernet) is up
Dec 20 22:47:13 x1 wifi-wired-exclusive[7981]: Disabling wifi, ethernet connection detected.
Dec 20 22:47:13 x1 wifi-wired-exclusive[8051]: Interface: wlp4s0 = unavailable (wifi) is down
Dec 20 22:47:21 x1 wifi-wired-exclusive[8097]: Interface: enx0050b6c0408e = unavailable (ethernet) is down
Dec 20 22:47:21 x1 wifi-wired-exclusive[8098]: Interface enx0050b6c0408e (ethernet) is down, enabling wifi ...
Dec 20 22:47:25 x1 wifi-wired-exclusive[8252]: Interface: wlp4s0 = connected (wifi) is up
Dec 20 22:47:31 x1 wifi-wired-exclusive[8407]: Interface: enx0050b6c0408e = connected (ethernet) is up
Dec 20 22:47:31 x1 wifi-wired-exclusive[8408]: Disabling wifi, ethernet connection detected.
Dec 20 22:47:31 x1 wifi-wired-exclusive[8474]: Interface: wlp4s0 = unavailable (wifi) is down
Dec 20 22:47:42 x1 wifi-wired-exclusive[8525]: Interface: enx0050b6c0408e = unavailable (ethernet) is down
Dec 20 22:47:42 x1 wifi-wired-exclusive[8526]: Interface enx0050b6c0408e (ethernet) is down, enabling wifi ...
Dec 20 22:47:46 x1 wifi-wired-exclusive[8679]: Interface: wlp4s0 = connected (wifi) is up