Linux系统下主要使用的WiFi配置工具有两种:

  • wireless tools:主要配置WEP加密的WiFi,现在iwconfig之类的命令已经被iw所替代了。本文中也部分的使用了iw进行WiFi的配置,如果想知道更多相关的功能,可以在shell窗口输入iw help查看。(依赖libnl库)
  • wpa_supplicant: 主要配置WPA和WPA2加密的WiFi,它被设计成一个运行在后台的守护进程。可以看成两个主要可执行工具:
    wpa_supplicant:后台运行,相当于服务端。
    wpa_cli:前端来进行搜索,设置和连接网络,相当于客户端。

下面我们将使用两种配置工具通过命令行分别对Linux进行WiFi配置。大家根据自己的要连接网络的加密方式选择合适的配置方法。

iw

获取Root权限
$ su
查找可用网卡
$ iw dev
phy#0
        Interface wlan1
                ifindex 7
                wdev 0x2
                addr 8e:f7:10:78:49:a2
                ssid COZY_49a2
                type AP
                txpower 31.00 dBm
        Interface wlan0
                ifindex 6
                wdev 0x1
                addr 8c:f7:10:78:49:a2
                type managed
                txpower 31.00 dBm

得到上面的输出,记下Interface(接口)之后的网卡名字。我这里有两个网卡,分别是wlan1wlan0。如果想要连接无线,不是随便选其中一个网卡就行了,要看网卡的类型,我们可以看到wlan1的类型是AP,它是作为一个无线接入点(Wireless access point),就是相当于一个无线信号发射的网卡,而wlan0的类型是managed,它是可以作为一个客户端接入主AP。这里我们要用板子连网,所以应该使用wlan0

查看激活网卡

首先查看网卡状态,观察其是否有被激活。

$ ip link show wlan0  //此处wlan1为网卡名字
//已激活状态,< >内包含UP关键字。
7: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 8e:f7:10:78:49:a2 brd ff:ff:ff:ff:ff:ff
    
//未激活状态,< >内不含UP关键字。
7: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 8e:f7:10:78:49:a2 brd ff:ff:ff:ff:ff:ff

会得到上面两种可能输出。
接着如果是还没激活的状态,我们可以选用下面两条语句其中一条对网卡进行激活。

$ ip link set wlan0 up  //此处wlan1为网卡名字
$ ifconfig wlan0 up 	//此处wlan1为网卡名字
wlan0: INTERFACE-ENABLED

输出打印的结果都是一样的,我们可以继续执行上面的查看状态命令重新查看网卡的状态,看看有没有激活成功。

搜索附近网络

搜索附近可用的无线网路,可选用下面的两条语句中的一条。
第一种方法是:

$ iw wlan0 scan | grep SSID
SSID: TP-LINK_0B8B
        SSID: TP-LINK_2458
        SSID: ChinaNet_1688
        SSID: CMW-AP
        SSID: wifitest

iw scan可以将无线网络的具体信息全部展示出来,我们加上了grep语句,抓取关键字符串SSID(网络名字),将其打印出来。

输入账户密码
$ iw wlan0 connect <SSID> keys d:1:<PSW> //SSID是WiFi名,PSW是密码
command failed: Operation not supported (-95)

结果报错误了,网上找了一下也没找到具体啥错误,但是个人猜测是连接的无线网络不是WEP加密的。所以没办法通过iw命令进行配置连接了。但是如果是WEP加密的话,到这一步应该就已经网络连接成功了。
最后就是测试网络是否连接上了,这里就没办法测试了,剩下的测试步骤留给wpa_supplicant配置成功之后进行把。

wpa supplicant

启动后台运行

iw命令有些不同,如果要运行wpa_supplicant的话,要先启动其在后台运行。这一步感觉就已经将网卡激活了。如果没有就再运行一次$ ifconfig wlan0 up命令

$ wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B
  • -D <driver name> 驱动程序名字(nl80211或west)
  • -i <interface name> 网卡名字
  • - c <conf file dir> 配置文件
  • -B 后台运行
搜索附近网络

第一条命令执行搜索功能,第二条命令只有展示功能,没有搜索功能。

$ wpa_cli -i wlan0 scan             
$ wpa_cli -i wlan0 scan_result
bssid / frequency / signal level / flags / ssid
48:7d:2e:be:24:58       2462    -72     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      TP-LINK_2458
74:05:a5:0d:0b:8b       2462    -76     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      TP-LINK_0B8B
34:ce:00:0a:c6:c0       2472    -76     [WPA2-PSK-CCMP][ESS]    ABC
74:da:da:8f:7f:d8       2447    -80     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]    D-Link_DIR_cyan
80:ea:07:d8:97:45       2437    -80     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      TP-LINK_9547
dc:fe:18:ba:5c:31       2437    -81     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      test_vmx
88:25:93:31:8e:a2       2412    -83     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      TP_LINK_8EA2
80:ea:07:d8:c8:6e       2437    -84     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      TP-LINK_C86E
50:bd:5f:04:d9:04       2437    -86     [WPA2-PSK-CCMP][ESS]    20200401
8c:a6:df:f7:31:d5       2412    -87     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      TP-LINK_YC
ac:f2:c5:96:82:e6       2437    -93     [WPA2-PSK-CCMP][ESS]    ott123

从这里就能看到各个WiFi的具体信息,也能看到他们的加密方式有WPA,WPA2和ESS,就是没有WEP,所以刚才连不了(笑)。最后一列就是我们需要的SSID

输入账户密码

wpa_supplicant里有两种方式输入账户和密码:

  • 命令行输入:这是一种暂时的输入,下次系统重启之后要重新输入。
  • 修改配置文件:直接在配置文件里配置账户和密码。下次重启之后系统自动连接。
命令行输入

首先进入交互模式:

$ wpa_cli -i wlan0

然后根据前面看到的,需要连接的WiFi网络的加密信息来确定连接方式。

// $
> add_network
> set_network 0 ssid "SSID"
> set_network 0 psk "Password"  
> enable_network 0
<3>CTRL-EVENT-SCAN-STARTED 
<3>CTRL-EVENT-SCAN-RESULTS 
<3>CTRL-EVENT-NETWORK-NOT-FOUND 
<3>CTRL-EVENT-SCAN-STARTED 
<3>CTRL-EVENT-SCAN-RESULTS 
<3>Trying to associate with c2:b8:b6:a7:8a:00 (SSID='Jiangnan' freq=2412 MHz)
> [  382.799309@1] Connecting with c2:b8:b6:a7:8a:00 ssid "Jiangnan", len (8) channel=1
[  382.799309@1] 
[  382.878924@1] wl_iw_event: Link UP with BSSID=c2:b8:b6:a7:8a:00
[  382.879278@1] wl_bss_connect_done succeeded with c2:b8:b6:a7:8a:00
<3>Associated with c2:b8:b6:a7:8a:00
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>WPA: Key negotiation completed with c2:b8:b6:a7:8a:00 [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to c2:b8:b6:a7:8a:00 completed [id=0 id_str=]
> [  382.982776@1] wl_bss_connect_done succeeded with c2:b8:b6:a7:8a:00

这样网络就连接成功了。我们还可以加上一句命令将这次连接成功的配置保存到/etc/wpa_supplicant.conf文件里。

$ wpa_cli -i wlan0 save_config

这样我们用cat命令查看文件的时候,就会发现网络名和密码已经保存到里面了。

配置文件连接

通过直接修改配置文件/etc/wpa_supplicant.conf,将网络名和密码直接写入配置文件中进行连接。
首先进入到/etc的目录下,然后用vi打开配置文件,wpa_supplicant的配置文件就在该目录下

$ cd ./etc
$ vi wpa_supplicant.conf

此时我们已经进入了配置文件,但是要编辑文件需要按i进入编辑模式,将配置文件加入network项:

ctrl_interface=/var/run/wpa_supplicant
update_config=1
network={
        ssid="SSID"
        psk="Password"
}

修改完成,键入Esc,退出编辑模式,然后键入:x对修改之后的文件进行保存。

获取IP地址
$ dhclient wlan0

我看很多文章都是用dhclient命令获取IP地址的,但是不知道为什么我的Linux上说找不到这个命令,应该是少了些东西。
没有网关的话,如果你ping外网的话会出现错误。
所以我们用route命令查看内核路由表

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
127.0.0.0       *               255.0.0.0       U     0      0        0 lo
172.20.10.0     *               255.255.255.240 U     306    0        0 wlan0
192.168.2.0     *               255.255.255.0   U     0      0        0 wlan1
192.168.5.0     *               255.255.255.0   U     0      0        0 usb0

我们会发现gateway也就是网关这一项什么都没有,所以我们需要分配一个默认网关。

route add default gw 10.0.0.253	//这个ip是通过ifconfig或ip addr查到的

这样子就分配好了网关。

还有一种方式就是直接对系统进行重启ireboot,然后系统下次会自动给你分配好IP地址,直接就能够联网成功。

检测网络连接

这里我们使用ping百度的方式来检测连接。

$ ping -c10 www.baidu.com

-c10表示发10个包过去。

PING www.baidu.com (183.232.231.172): 56 data bytes
64 bytes from 183.232.231.172: seq=0 ttl=55 time=68.751 ms
64 bytes from 183.232.231.172: seq=1 ttl=55 time=173.151 ms
64 bytes from 183.232.231.172: seq=2 ttl=55 time=120.435 ms
64 bytes from 183.232.231.172: seq=3 ttl=55 time=63.139 ms
64 bytes from 183.232.231.172: seq=4 ttl=55 time=58.868 ms
64 bytes from 183.232.231.172: seq=5 ttl=55 time=197.981 ms
64 bytes from 183.232.231.172: seq=6 ttl=55 time=57.563 ms
64 bytes from 183.232.231.172: seq=7 ttl=55 time=56.769 ms
64 bytes from 183.232.231.172: seq=8 ttl=55 time=89.183 ms
64 bytes from 183.232.231.172: seq=9 ttl=55 time=75.906 ms

--- www.baidu.com ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 56.769/96.174/197.981 ms

完成!