在linux系统上,wpa_supplicant是一个强大的无线网卡管理程序,它负责Wi-Fi的配置/扫描/连接。
可以通过wpa_cli程序控制wpa_supplicant进行Wi-Fi的配置与连接,但首先要确保wpa_supplicant运行正常(wpa_supplicant是以持久方式运行的)。
这一章主要讲如何通过wpa_cli命令快速连接上AP。
wpa_cli常用命令
wpa_cli命令 | 说明 |
---|---|
scan | 发起扫描AP请求 |
scan_results | 获取AP扫描结果 |
add_network | 添加一个新网络 |
set_network | 配置网络SSID/KEY_MGMT/PSK |
enable_network | 使能网络 |
status | 获取网卡状态 |
select_network | 选择工作网络 |
list_network | 列出所有网络 |
remove_netwrok | 移除网络 |
以下操作都假设无线网卡名称为wlan0
,如果不正确可以通过ifconfig -a
查询当前系统下所有网卡。
扫描热点
$ wpa_cli -iwlan0 scan
$ wpa_cli -iwlan0 scan_results
scan
完成后会返回ok,然后可以通过scan_results
获取热点扫描结果,从中选择我们想要连接的热点。
扫描结果里有AP的关键信息:BSSID / 频率(通道)/ 信号 / 认证方式 和 SSID。
连接无认证密钥热点
$ wpa_cli -iwlan0 add_network # 返回的network_id要在接下来使用,例如0
$ wpa_cli -iwlan0 set_network 0 ssid "Opened-SSID"
$ wpa_cli -iwlan0 set_netwrok 0 key_mgmt NONE
$ wpa_cli -iwlan0 enable_network 0
- 通过
add_network
告知wpa_supplicant进程要创建一个网络,wpa_supplicant创建完成后,会返回一个network_id(数值会累加),比如我们上面的样例返回0. - 通过
set_network
配置网络(network_id为0)的SSID为Opened-SSID. - 通过
set_network
配置网络(network_id为0)的密钥管理方式为NONE(认证不需要加密,传输不需要加密) - 使能network_id为0的网络
以上操作完成后,如果设备网络环境正常,设备会连接到名为Opened-SSID的AP,但此时设备并不能上网,需要同路由协商获取一个IP方可联网。
udhcpc -i wlan0
udhcpc
获取到IP后,可以访问路由所在网络。如果路由连接了Internet,那么设备就可以访问Internet进行上网。
我们可以通过status
命令查询无线网卡状态,查询命令如下:
$ wpa_cli -iwlan0 status
连接WEP密钥热点
$ wpa_cli -iwlan0 add_network # 假设这次返回1
$ wpa_cli -iwlan0 set_network 1 ssid "WEP-SSID"
$ wpa_cli -iwlan0 set_network 1 key_mgmt NONE
$ wpa_cli -iwlan0 set_network 1 wep_key0 "12345678"
$ wpa_cli -iwlan0 enable_network 1
连接WEP密钥热点比连接OPEN热点多了一步wep_ke0
属性配置,它是用来配置网络(network_id为1)的WEP密钥方式的密码。
其它同上。
连接WPA-PSK/WPA2-PSK密钥热点
$ wpa_cli -iwlan0 add_network # 假设这次返回2
$ wpa_cli -iwlan0 set_network 2 ssid "PSK-SSID"
$ wpa_cli -iwlan0 set_network 2 key_mgmt WPA-PSK
$ wpa_cli -iwlan0 set_network 2 psk "1234567890"
$ wpa_cli -iwlan0 enable_network 2
连接WPA-PSK/WPA2-PSK密钥热点将key_mgmt密钥管理协议配置为WPA-PSK/WPA2-PSK;同时用psk
属性来配置密码。
其它同上。
切换已配置热点
假设我们已经通过wpa_cli
创建且使能了多个网络,可以通过select_network
来切换热点连接,切换命令如下:
$ wpa_cli -iwlan0 select_network $network_id
$network_id是每次add_network
返回的netowr_id。
连接隐藏热点
隐藏热点不会通过Beacon帧来宣布自身的存在,所以设备(工作站)一般要主要通过(Probe Request)主动扫描热点,主动扫描命令开启如下:
$ wpa_cli -iwlan0 set_network $network_id scan_ssid 1