Skip to content

Instantly share code, notes, and snippets.

@EnismanY
Last active May 1, 2024 14:43
Show Gist options
  • Save EnismanY/d8e72e98f40cedd835e82d25cc619244 to your computer and use it in GitHub Desktop.
Save EnismanY/d8e72e98f40cedd835e82d25cc619244 to your computer and use it in GitHub Desktop.
Linux WiFi from the command line

Network speed, signal strength and specifying the band

Identify network interfaces

ifconfig -a

or:

ip a

Identifying status

To identify the status execute:

sudo wpa_cli -i wlan0 status

This provides details including, frequency of WiFi, BSSID, SSID, encryption (for WPA2-PSK, should see pairwise_cipher and group_cipher are CCMP) MAC address and IP address.

Turn off WiFi

There are several options for turning off WiFi, what works will be dependent on how the system is configured. Assuming the WiFi interface is wlan0, options are:

sudo ifdown wlan0

sudo ifconfig wlan0 down

sudo ip link set wlan0 down

or, using rfkill:

  • First list all devices using:

    sudo rfkill list
    

    This will yield output similar to:

    0: phy0: Wireless LAN
            Soft blocked: no
            Hard blocked: no
    1: hci0: Bluetooth
            Soft blocked: no
            Hard blocked: no
    

    In order to block WiFi excecute the following:

    sudo rfkill block 0
    

Turn on WiFi

Again, there are multiple options:

sudo ifup wlan0

sudo ifconfig wlan0 up

sudo ip link set wlan0 up

Alternatively, assuming the number of the device has been ascertained using rfkill list (0 in the example below) execute:

sudo rfkill unblock 0

Display information about the WiFi interface

Assuming WiFi interface is wlan0:

iwconfig wlan0

Finding WiFi link quality & signal level

iwconfig wlan0 | grep -i --color "Quality\|Signal"

The numbers reported for quality will be WiFi driver dependent.

Continous update of link quality

The file /proc/net/wireless contains information about the WiFi signal. This can be viewed continually using a combination of the cat and watch commands.

watch -n 1 cat /proc/net/wireless

Alternatively, the ncurses-based monitoring application wavemon can be used. This will likely need installing, which in Debian based distributions can be achieved using:

sudo apt install wavemon

To use the application simply run:

wavemon

Some of the above information sourced from 8 Linux Commands: To Find Out Wireless Network Speed, Signal Strength And Other Information

Setting a prefered WiFi band

It is possible to set a preferred WiFi band, ie 2.5 or 5 GHz. This may be desirable to avoid interference from other devices or to improve range/speed. Remember, 2.5 GHz has the better range and 5 GHz the better speed.

First check the network interface is capable of using both bands. There are at least two methods to determine this.

Method 1

Run:

sudo iwlist wlan0 scan | grep -i "Frequency\|Address\|ESSID"

THe output will be similar to:

Cell 01 - Address: ab:12:cd:34:ef:56
          Frequency:2.412 GHz
          ESSID:"DESIRED SSID"
Cell 02 - Address: gh:78:ij:90:kl:12
          Frequency:5.70 GHz
          ESSID:"DESIRED SSID"
.....

Method 2

Run:

iw list | grep -i "Frequencies\|MHz\|GHz"

In the output look for the section(s) entitles Frequencies, which will be similar to:

Frequencies:
            * 5180 MHz [36] (22.0 dBm) (no IR)
            * 5200 MHz [40] (22.0 dBm) (no IR)
            * 5220 MHz [44] (22.0 dBm) (no IR)
            * 5240 MHz [48] (22.0 dBm) (no IR)
            .....

The frequencies are the centre of the band.

Both the SSID and BSSID are required, the BSSID is the MAC address for a particular band of the access point. To obtain this information, enter the wpa command line interface by running the following, where wlan0 is the name of the wireless network interface:

sudo wpa_cli -i wlan0

Once in the iteractive mode, indicated by:

Interactive mode

>

run the following two commands, letting the first command complete execution (indicated by a return of the > prompt) before running the second.

scan
scan_results

The output will be similar to:

bssid / frequency / signal level / flags / ssid
ab:12:cd:34:ef:56   2412    -79 [WPA2-PSK-CCMP][WPA2-PSK-CCMP][ESS]    DESIRED SSID
gh:78:ij:90:kl:12   5700    -84 [WPA2-PSK-CCMP][WPA2-PSK-CCMP][ESS]    DESIRED SSID
.....

This shows the desired SSID and the frequencies, 2.5 and 5 GHz, along with their respective BSSIDs.

Quit the interactive mode by entering q.

To modify the settings

Kill network-manager and wpa_supplicant:

sudo service network-manager stop && sudo killall wpa_supplicant

On the Raspberry Pi (August 2020) networking this can be achieved using:

sudo service networking stop && sudo killall wpa_supplicant

If /etc/wpa_supplicant.conf does not exist, create the file using:

sudo wpa_passphrase <SSID> > /etc/wpa_supplicant

<SSID> must be replaced with the SSID of the WiFi network. A blank prompt will be received awaiting the user to enter the password for the WiFi. Once this has been done edit the file using:

sudo nano /etc/wpa_supplicant.conf

Add the following to the file.

ctrl_interface=/var/run/wpa_supplicant

#settings for an AP using preshared keys, PSK
network={
        ssid=ssid
        scan_ssid=1 
        key_mgmt=WPA-PSK
        #psk==Password
        psk="Passkey generated by wpa_passphrase"
        bssid=gh:78:ij:90:kl:12   #the important part
}

#settings for an open AP. if you use this then don't use the above settings
network={
        ssid="DESIRED SSID"
        key_mgmt=NONE
        bssid=gh:78:ij:90:kl:12
}

ssid and psk will be those entered when using the wpa_passphrase command.

Delete the commented line containing the password, and ensure the bssid matches that of the access point and the desired band you wish to connect to, ie 2.5 or 5 GHz.

Now start the daemon in the background by running:

sudo wpa_supplicant -B -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0

If this fails, debug problems by running:

sudo wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0 -d

Unsure about the dhclient section (next two commands)

After authentication, tell dhclient to release the current lease ie IP address, it has from the server:

sudo dhclient -r

Request a dynamic IPv4 address (DHCP):

sudo dhclient wlan0

Finally, reconfigure the interface with:

wpa_cli -i wlan0 reconfigure

Verify whether WiFi has successfully connected and the correct band is being used by executing:

sudo wpa_cli -i wlan0 status

If the ip_address is not populated, the device has not connected to the network, check that thr password and ESSID are correct.

Sources of information:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment