微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试使用libnm 1.12.10获取保存在Ubuntu 20.02上的无线网络的密码。我想我应该对NMSecretAgentOld进行一些操作,但是我不知道到底是什么以及如何操作。我也没有在互联网上找到任何例子。 这是我当前的测试代码

/*
* The example shows how to list connections.  Contrast this example with
* list-connections-gdbus.c,which is a bit lower level and talks directly to NM
* using GDBus.
*
* Compile with:
*   gcc -Wall test.cpp -o test `pkg-config --libs --cflags libnm`
*/

#include <glib.h>
#include <stdio.h>
#include <stdlib.h>

#include <NetworkManager.h>
#include <nm-secret-agent-old.h>

/* Print details of connection */
static void
show_connection (NMConnection *connection)
{
   printf("--- CONNECTION ---\n");
   NMSettingWireless* s_con;
   NMSettingWirelessSecurity* wifiSec;
   const char* interfce;
   interfce = nm_connection_get_interface_name(connection);
   s_con = nm_connection_get_setting_wireless(connection);
   if (s_con) {
       GBytes* ssidBytes = nm_setting_wireless_get_ssid(s_con);
       const char* ssid = nm_utils_ssid_to_utf8((guint8 *)g_bytes_get_data(ssidBytes,NULL),g_bytes_get_size(ssidBytes));
       printf("SSID: %s\nInterface: %s\n",ssid,interfce);
       wifiSec = nm_connection_get_setting_wireless_security(connection);
       if(wifiSec){
           const char* auth = nm_setting_wireless_security_get_auth_alg(wifiSec);
           const char* encrypt = nm_setting_wireless_security_get_key_mgmt(wifiSec);
           const char* psk = nm_setting_wireless_security_get_psk(wifiSec); //THIS RETURNS NULL! BUT THE WPA-PSK PASSWORD IS SET!
           printf("Auth: %s\nEncryption: %s\nPassword: %s\n",auth,encrypt,psk);
           nm_connection_dump(connection); //Also in debug dump no password field
       }
   }
}

int
main (int argc,char *argv[])
{
   NMClient *client;
   GError *error = NULL;
   const GPtrArray *connections;
   int i;

#if !GLIB_CHECK_VERSION (2,35,0)
   /* Initialize GType system */
   g_type_init ();
#endif
   if (!(client = nm_client_new (NULL,&error))) {
       g_message ("Error: Could not connect to NetworkManager: %s.",error->message);
       g_error_free (error);
       return EXIT_FAILURE;
   }

   if (!nm_client_get_nm_running (client)) {
       g_message ("Error: Can't obtain connections: NetworkManager is not running.");
       return EXIT_FAILURE;
   }
   /* Now the connections can be listed. */
   connections = nm_client_get_connections (client);

   printf ("Connections:\n===================\n");

   for (i = 0; i < connections->len; i++)
       show_connection ((NMConnection*) connections->pdata[i]);

   g_object_unref (client);

   return EXIT_SUCCESS;
}

这是程序输出中有趣的部分:Program output image

这是etc / NetworkManager / system_connections转储(在其中设置了psk字段):Wireless Network file dump image

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。