Linux下wifi工具wpa_cli使用

2023-05-16

wpa_cli使用

  • 扫描
  • 查看扫描结果
  • 添加network
  • 设置SSID
  • 选择某个network
  • 查看networks
  • 使能某个network
  • 查询连接情况
  • 自动分配IP地址
  • API Demo

扫描

[root@demo]# wpa_cli -i wlan0 scan
OK

查看扫描结果

  • 注意返回格式
    bssid ’\t’ frequency ’\t’ signal level ’\t’ flags ’\t’ ssid ’\n’
    这中间是用制表符’\t’,隔开的,最后一个字符是’\n’
[root@demo]# wpa_cli -i wlan0 scan_result
bssid / frequency / signal level / flags / ssid
dc:fe:18:19:bf:4d       2462    -47     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      TP-LINK_BF4D
34:0a:98:97:9a:14       2427    -66     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][WPS][ESS]       CMCC-3KUu
d4:62:ea:80:84:10       2462    -71     [WPA2-PSK-CCMP][WPS][ESS]       HUAWEI-H
68:db:54:6b:25:8f       2422    -75     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]    @PHICOMM_8D
50:fa:84:88:6a:85       2462    -75     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]    TP-LINK_6856
d0:76:e7:35:4a:03       2437    -77     [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]      TP-LINK_903

添加network

[root@demo]#wpa_cli -i wlan0 add_network
0
[root@demo]#wpa_cli -i wlan0 add_network
1

设置 SSID

  • [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS] (wpa加密),wifi名称是name, wifi密码是psk
[root@demo]$ wpa_cli -i wlan0 set_network 0 ssid '"name"'  
[root@demo]$ wpa_cli -i wlan0 set_network 0 psk '"psk"'  
[root@demo]$ wpa_cli -i wlan0 enable_network 0
  • [WEP][ESS]wep加密
[root@demo]$ wpa_cli -i wlan0 set_network 0 ssid '"name"'  
[root@demo]$ wpa_cli -i wlan0 set_network 0 key_mgmt NONE  
[root@demo]$ wpa_cli -i wlan0 set_network 0 wep_key0 '"psk"'  
[root@demo]$ wpa_cli -i wlan0 enable_network 0  
  • [ESS]无加密连接,wifi名称是name
[root@demo]	$ wpa_cli -i wlan0 set_network 0 ssid '"name"'  
[root@demo]	$ wpa_cli -i wlan0 set_network 0 key_mgmt NONE  
[root@demo]$ wpa_cli -i wlan0 enable_network 0 

查看networks

[root@demo]	$ wpa_cli list_networks
Selected interface 'wlan0'
network		id	/ssid	/bssid/	flags
0					any			[CURRENT]
1					any			[DISABLE]

选择某个network

[root@demo]	$ wpa_cli select_netowrk 0
Selected interface 'wlan0'
OK

使能某个network

[root@demo]	$ wpa_cli -i wlan0 enable_network 0
OK  

查询连接情况

[root@demo]	$ wpa_cli -i wlan0 status
 //返回内容请见下图 

在这里插入图片描述

自动分配IP地址

[root@demo]	$ udhcpc -i wlan0
udhcpc(v1.23.2) started
Sending discover...
Sending select for 192.168.0.104...
Lease of 192.168.0.104 obtained, lease time 7200
deleting routers
adding dns

API Demo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>


static char wifi_ssid[16][128];
static char *wifi_name[16];
//----------------------------------------------------------------------
// D E F I N I T I O N
//----------------------------------------------------------------------


//----------------------------------------------------------------------
// L O C A L  D E F I N I T I O N
//----------------------------------------------------------------------
static const char *SCAN        ="wpa_cli -i wlan0 scan";
static const char *SCAN_RES    ="wpa_cli -i wlan0 scan_result";
static const char *ADD_NETWORK = "wpa_cli -i wlan0 add_network";
static const char *SELECT_NETWORK   ="wpa_cli -i wlan0 select_network";
static const char *STATUS       ="wpa_cli -i wlan0 status";
static const char *SET_SSID = "wpa_cli -i wlan0 set_network 0 ssid";
static const char *SET_PASSWORD = "wpa_cli -i wlan0 set_network 0 psk";
static const char *ENABLE_NETWORK  = "wpa_cli -i wlan0 enable_network 0";
static const char *UDHCPC_NETWORK  = "udhcpc -i wlan0";

//----------------------------------------------------------------------
// L O C A L  F U N C T I O N  D E F I N I T I O N
//----------------------------------------------------------------------
static int wifi_scan(void);
static void wifi_scan_result(char (*ssid_buf)[128]);
//----------------------------------------------------------------------
// L O C A L  F U N C T I O N  I M P L E M E N T A T I O N
//----------------------------------------------------------------------

//----------------------------------------------------------------------
// function: wifi_scan
// parameter: none
// return:   1 -- scan OK    0 -- scan failed
//----------------------------------------------------------------------
static int wifi_scan(void)
{
	FILE *fp;
	char buf[8]={0};
	if((fp = popen(SCAN,"r"))==NULL)
	{
		perror("SCAN");
		exit(1);
	}
	while(fgets(buf,sizeof(buf),fp)!=NULL) //fgets()此处是否会阻塞?
	{
		printf("%s\n",buf);
		if(strstr(buf,"OK")!=NULL)
		{
			printf("close fp and return\n");
			pclose(fp);
			return 1;
		}
	}
	return 0;
}

//----------------------------------------------------------------------
// function:  set_noblock_read
// statement: set fgets noblock read mode
// parameter: FILE* fstream, which is popen func returned
// return:    none
//----------------------------------------------------------------------
static void set_noblock_read(FILE *fstream)
{
	int fd;
	int flags;
	fd = fileno(fstream);
	flags = fcntl(fd,F_GETFL,0);
	flags |= O_NONBLOCK;
	fcntl(fd,F_SETFL,flags);
	return ;
}

//----------------------------------------------------------------------
// function:  wifi_scan_res
// statement: show scan result, get ssid to the ssid buf
// parameter: wifi_ssid buf
// return:    none
//----------------------------------------------------------------------
static void wifi_scan_result(char (*ssid_buf)[128])
{
	FILE *fp;
	char *p_n=NULL;
	char *p_ssid_end = NULL;
	char *p_ssid_start=NULL;
	char buf[4096]={0};
	int flags;
	int ssid_index=0;
	if((fp=popen(SCAN_RES,"r"))==NULL)
	{
		perror("SCAN_RES");
		exit(1);
	}
	int fd = fileno(fp); //把文件指针转换成文件描述符用fileno函数
	flags = fcntl(fd,F_GETFL,0);
	flags |= O_NONBLOCK;   //O_NONBLOCK = 04000
	fcntl(fd,F_SETFL,flags);
	sleep(1);  //这里必须要等待一下,否则fgets立即返回NULL,捕获不到数据
	while(fgets(buf,sizeof(buf),fp)!=NULL) //wifi扫描不到是否意味着就一直阻塞在这里?比如在没有WiFi的地方
	{
		//printf("%s",buf);
		if(strstr(buf,(const char*)"bssid")!=NULL) //忽略第一行
		{
			continue;
		}
		if((p_n = strstr(buf,"\n"))!=NULL) //注意,\n是接收到的最后一个字符
		{
			p_ssid_end = p_n-1; //'\n前面一个字符'
			while(*p_n !='\t') //中间是用'\t'制表符隔开的
			{
				p_n--;
			}
			p_ssid_start = p_n; //'\t'
			strncpy(ssid_buf[ssid_index],(p_ssid_start+1),(p_ssid_end-p_ssid_start));
			printf("%s\n",ssid_buf[ssid_index]);
			ssid_index++;
		}
	}
	printf("fgets() return without block and close fp\n");
	pclose(fp);

	return ;
}

//----------------------------------------------------------------------
// function:  wifi_add_network
// statement: add net work, there where a network list, wpa_cli list_networks
//            can see how many network add add in the lsit, but there is only
//            one in the current state.
// parameter: null
// return:    the network id in the system
//
//----------------------------------------------------------------------
static int wifi_add_network(void)
{
	FILE *fp;
	char buf[8]={0};
	if((fp = popen(ADD_NETWORK,"r"))==NULL)
	{
		perror("ADD_NETWORK");
		exit(1);
	}
	while(fgets(buf,sizeof(buf),fp)!=NULL)
	{
		printf("%s\n",buf);
	}
	return 0;
}

//----------------------------------------------------------------------
// function:  wifi_set_ssid(char *ssid_name)
// statement: set ssid name
//
// parameter:
// return:    1 -- success
//            0 -- failed
//----------------------------------------------------------------------
static int wifi_set_ssid(char *ssid_name)
{
	FILE *fp;
	char buf[128]={0};
	char cmd[128]="";
	strcat(cmd,SET_SSID);
	strcat(cmd," '\"");
	strcat(cmd,ssid_name);
	strcat(cmd,"\"'");
	printf("%s\n",cmd);
	if((fp=popen(cmd,"r"))==NULL)
	{
		perror("set ssid failed");
		exit(1);
	}
	set_noblock_read(fp); //no block read
	sleep(1);
	while(fgets(buf,sizeof(buf),fp)!=NULL)
	{
		printf("%s\n",buf);
		if(strstr(buf,"OK")!=NULL)
		{
			pclose(fp);
			return 1;
		}
	}
	pclose(fp);
	return 0;
}

//----------------------------------------------------------------------
// function:  wifi_set_password(char *password)
// statement: set password
//
// parameter:
// return:    1 -- success
//            0 -- failed
//----------------------------------------------------------------------
static int wifi_set_password(char *password)
{
	FILE *fp;
	char buf[128]={0};
	char cmd[128]="";
	strcat(cmd,SET_PASSWORD);
	strcat(cmd," '\"");
	strcat(cmd,password);
	strcat(cmd,"\"'");
	printf("%s\n",cmd);
	if((fp=popen(cmd,"r"))==NULL)
	{
		perror("set password failed");
		exit(1);
	}
	set_noblock_read(fp); //no block read
	sleep(1);
	while(fgets(buf,sizeof(buf),fp)!=NULL)
	{
		printf("%s\n",buf);
		if(strstr(buf,"OK")!=NULL)
		{
			pclose(fp);
			return 1;
		}
	}
	pclose(fp);
	return 0;
}

//----------------------------------------------------------------------
// function:  wifi_enable_netword(char *password)
// statement: after set ssid and psk, need to enable network.
//            then can use udhcpc -i wlan0
// parameter:
// return:    1 -- success
//            0 -- failed
//----------------------------------------------------------------------
static int wifi_enable_network(void)
{
	FILE *fp;
	char buf[8]={0};
	fp=popen(ENABLE_NETWORK,"r");
	while(fgets(buf,8,fp)!=NULL)
	{
		printf("%s\n",buf);
		if(strstr(buf,"OK")!=NULL)
		{
			pclose(fp);
			return 1;
		}
	}
	pclose(fp);
	return 0;
}

//----------------------------------------------------------------------
// M I A N   F U N C T I O N
//----------------------------------------------------------------------
int main()
{
	memset(wifi_ssid,0,sizeof(char)*16*128);
	wifi_scan();
	sleep(2);
	wifi_scan_result(wifi_ssid);
	wifi_add_network();
	wifi_set_ssid("TP-LINK_BF4D");
	wifi_set_password("wjj198712162803");
	wifi_enable_network();
	exit(1);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下wifi工具wpa_cli使用 的相关文章

  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • Elasticsearch 无法写入日志文件

    我想激活 elasticsearch 的日志 当我运行 elasticsearch 二进制文件时 我意识到我在日志记录方面遇到问题 无法加载配置 这是输出 sudo usr share elasticsearch bin elasticse
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 创建 jar 文件 - 保留文件权限

    我想知道如何创建一个保留其内容的文件权限的 jar 文件 我将源代码和可执行文件打包在一个 jar 文件中 该文件将在使用前提取 人们应该能够通过运行批处理 shell 脚本文件立即运行示例和演示 然后他们应该能够修改源代码并重新编译所有内
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec

随机推荐

  • debian10安装apache2 php ftp(网站服务器)

    debian安装网站服务 debian最小安装后重启机器 设置语言 dpkg reconfigure locales 选择en US UTF 8 UTF 8 xff08 其它都不选 xff09 重启机器 修改软件安装源文件 xff08 如果
  • 正则表达式(转载)

    正则表达式的基本语法 开始和结尾位置声明 表示字符串的开始 xff0c 要匹配 本身需要使用 例如 xff1a Yao 表示字符串以 Yao 开头 表示字符串的结尾 xff0c 要匹配 本身需要使用 例如 xff1a Yao 表示字符串以
  • apache2网站设置

    apache2网站设置 我们访问一个网址是先解析成对应的IP的80端口开始的 打开apache2网站配置文件 nano etc apache2 sites available 000 default conf 可以看到 lt Virtual
  • apache用户名和密码验证

    apache用户名和密码验证 之前建立的www soft com这个网站我们给他加个访问验证 修改 etc apache2 apache2 conf nano etc apache2 apache2 conf 把 lt Directory
  • php安装swoole插件

    swoole插件 安装wget apt install wget 安装openssl apt install openssl xff08 https要用到 安装phpize apt install php7 3 dev 安装make apt
  • 五:debian安装,附加审批系统

    如果你还没读第一篇和第二篇请阅读第一篇Debian 安装和第二篇Debian 服务器安装 服务器开始安装审批系统 wget c https jiaozhiguan 1258621244 cos ap guangzhou myqcloud c
  • SpringBoot项目的出现java.io.FileNotFoundException: (系统找不到指定的路径。)

    项目场景 xff1a SpringBoot项目的出现java io FileNotFoundException 系统找不到指定的路径 项目场景 xff1a Springboot用到文件上传下载功能 问题描述 xff1a 问题 xff1a j
  • mysql创建用户报错[Err] 1396 - Operation CREATE USER failed for ‘用户名‘@‘%‘的解决方法

    项目场景 xff1a 执行mysql创建用户语句CREATE USER test IDENTIFIED BY 用户名 问题描述 xff1a 执行mysql创建用户语句CREATE USER test IDENTIFIED BY 39 用户名
  • 解决nginx提示:(code=exited, status=203/EXEC)的错误

    项目场景 xff1a 在centos7上启动nginx1 19 安装过程省略 问题描述 xff1a 编译安装一切顺利 xff0c 使用systemctl start nginx时提示如下内容 xff1a span class token p
  • You don‘t have permission to access this resource.

    项目场景 xff1a 访问自己的搭建的网站时apache报错You don t have permission to access this resource 原因分析 遇到如标题那个问题 xff0c 无法进行远程HTTP请求 解决方案 x
  • cmd下windows批处理bat,获取当前系统时间,生成日志文件名

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 Window系统一 范例二 方法详解1 获取日期2 获取时间3 详解 总结更多 关于Linux的写法 Window系统 常用的Win
  • Centos 7 SSH服务安全加固

    描述 禁止SSH空密码用户登录 xff0c 限制可登录用户及来源地址 加固建议 编辑文件 etc ssh sshd config xff0c 将一应配置修改 具体操作命令和步骤 1 编辑文件 etc ssh sshd config vim
  • 第18章 异常处理

    问题 xff1a c 43 43 异常处理是不是必须有try xff0c 才能有catch 下面自己验证下 方法1 xff1a 如果没有try catch语句块能不能处理异常 xff1f include lt string gt inclu
  • Centos7十五项安全加固标准配置(结合等保3)

    写在前面 xff1a 由于所有操作均涉及系统文件 xff0c 建议所有操作前备份文件及做好相关记录 一 检查系统空密码账户 身份鉴别 描述 检查是否存在空口令和root权限的账号 加固建议 对无口令并且可登录的账户 xff0c 进行密码设置
  • ThinkPHP下 自定义日志输出

    项目场景 xff1a 不想调用TP的 think Log类工具 xff0c 而是自定义日志的输出路径 文件名和内容 xff1a 解决方案 xff1a 提示 xff1a 这里填写该问题的具体解决方案 xff1a 1 首先在common php
  • Ubuntu下代理设置方法

    Ubuntu下代理设置方法 一 临时的手段 在命令行中临时设置 xff0c export http proxy 61 34 http username password 64 proxyIP proxyPort 34 xff0c 和其他临时
  • 缓解pandas中DataFrame占用内存过大的问题

    本文最后修改于2018 01 21 xff0c 文章有问题或者转载请及时联系本人 xff0c 如果对你有帮助 xff0c 别忘了点下关注 0 背景 在我们使用pandas进行数据处理的时候 xff0c 有时候发现文件在本地明明不大 xff0
  • “智医助理”噱头>实用性?详解科大讯飞医疗新布局

    关注52AI xff0c 做AI的行业领先者 QQ人工智能行业交流群 xff1a 626784247 01 以456分通过执医考试的 智医助理 xff0c 真的能够用于临床辅助诊断吗 xff1f 在国际权威的肺结节检测大赛LUNA16中刷新
  • centos8上实现私有CA和证书申请颁发

    一 创建生成密钥文件 1 用下面这条命令查看这个路径下有没有文件 如果报错没有 span class token function ls span etc pki CA 2 就递归创建出以下文件 span class token funct
  • Linux下wifi工具wpa_cli使用

    wpa cli使用 扫描查看扫描结果添加network设置SSID选择某个network查看networks使能某个network查询连接情况自动分配IP地址API Demo 扫描 root 64 demo wpa cli i wlan0