C++ libnm和C:如何获取已保存无线网络的密码?

C++ libnm和C:如何获取已保存无线网络的密码?,c++,c,linux,wireless,C++,C,Linux,Wireless,我正在尝试使用libnm1.12.10获取保存在Ubuntu 20.02上的无线网络密码。我想我应该和NMSECURAGENTOLD做点什么,但我不知道具体是什么,怎么做。我也没有在互联网上找到任何例子。 这是我当前的测试代码: /* *该示例显示了如何列出连接。将此示例与 *列出连接gdbus.c,它的级别稍低,直接与NM对话 *使用GDBus。 * *编译时使用: *gcc-Wall test.cpp-o test`pkg config--libs--cflags libnm` */ #包括

我正在尝试使用libnm1.12.10获取保存在Ubuntu 20.02上的无线网络密码。我想我应该和NMSECURAGENTOLD做点什么,但我不知道具体是什么,怎么做。我也没有在互联网上找到任何例子。 这是我当前的测试代码:

/*
*该示例显示了如何列出连接。将此示例与
*列出连接gdbus.c,它的级别稍低,直接与NM对话
*使用GDBus。
*
*编译时使用:
*gcc-Wall test.cpp-o test`pkg config--libs--cflags libnm`
*/
#包括
#包括
#包括
#包括
#包括
/*打印连接的详细信息*/
静态空隙
显示\u连接(NMConnection*连接)
{
printf(“---连接--\n”);
NMSETTINGWILESS*s_con;
NMSettingWirelessSecurity*wifiSec;
常量字符*干扰;
interfce=nm\u连接\u获取\u接口\u名称(连接);
s_con=nm_连接\u获取设置\u无线(连接);
如果(s_con){
GB字节*ssidBytes=nm\u设置\u无线\u获取\u ssid(s\u con);
const char*ssid=nm_utils_ssid_to_utf8((guint8*)g_字节_获取数据(ssidBytes,NULL),g_字节_获取大小(ssidBytes));
printf(“SSID:%s\n接口:%s\n”,SSID,接口);
wifiSec=nm\u连接\u获取\u设置\u无线\u安全(连接);
国际单项体育联合会(wifiSec){
const char*auth=nm\u设置\u无线\u安全\u获取\u授权\u alg(wifiSec);
const char*encrypt=nm\u设置无线安全获取密钥管理(wifiSec);
const char*psk=nm\u setting\u wireless\u security\u get\u psk(wifiSec);//返回NULL!但设置了WPA-psk密码!
printf(“身份验证:%s\n加密:%s\n密码:%s\n”,身份验证,加密,psk);
nm_connection_dump(connection);//也在debug dump no password字段中
}
}
}
int
main(int argc,char*argv[])
{
NMClient*客户端;
GError*error=NULL;
常量GPtrArray*连接;
int i;
#如果!油嘴滑舌检查版本(2,35,0)
/*初始化GType系统*/
g_type_init();
#恩迪夫
如果(!(client=nm\u client\u new(NULL,&错误))){
g_消息(“错误:无法连接到网络管理器:%s.”,错误->消息);
g_无错误(错误);
返回退出失败;
}
如果(!nm\u客户端\u获取\u nm\u运行(客户端)){
g_消息(“错误:无法获取连接:NetworkManager未运行”);
返回退出失败;
}
/*现在可以列出连接*/
连接=nm\u客户端\u获取\u连接(客户端);
printf(“连接:\n===============================\n”);
对于(i=0;ilen;i++)
显示_连接((NMConnection*)连接->pdata[i]);
g_object_unref(客户);
返回退出成功;
}
这是程序输出的有趣部分:

这是etc/NetworkManager/system_connections转储(其中设置了psk字段):