gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

如何利用Node獲取物理網卡mac地址

本篇文章介紹一下利用Node獲取真實物理網卡的 MAC 地址的方法,其中主要討論了基于實踐經驗對虛擬網卡的識別處理方式,希望對大家有所幫助!

如何利用Node獲取物理網卡mac地址

node.js極速入門課程:進入學習

在基于 Electron 的應用中,有一個業務需求是獲取物理網卡的 Mac 地址以用于客戶機唯一性識別。

剛接到需求時你可能會想,這還不簡單,調用 Node.js 的 os 模塊提供的 networkInterfaces API 就行了。【相關教程推薦:nodejs視頻教程】

于是馬上開干:

import { networkInterfaces } from 'os';   function isZeroMac(mac) {   return /^(0{1,2}[:-]){5}0{1,2}$/.test(mac); }  function getMac(family = 'IPv4') {     const nif = networkInterfaces();     for (const list of Object.values(nif)) {         const item = list.find(d => !d.internal && !isZeroMac(d.mac) && (!d.family ||d.family === family));         if (item) return item.mac;    }     return ''; }
登錄后復制

兩分鐘就寫完了,測試一下返回值也與 ipconfig/ifconfig 打印的信息一致,滿懷信心的提交代碼完工。

測試同學當天驗證了一下表示沒什么問題,然而第二天卻找上門了:同一臺電腦今昨兩天取到的值不一樣。經過各種排查分析,最后才發現原來這位測試妹妹因疫情管控居家了,用著 VPN 遠程接入辦公網絡干活呢。

原來開 VPN 的時候使用了虛擬網卡,此時你才發現事情并沒有那么簡單。實際上,在存在 VPN、虛擬機等場景下,都可能會使用到虛擬網卡。

1. 根據 networkInterfaces 返回值的字段值過濾

networkInterfaces 可以獲取到所有網卡的基本信息,可根據 internalmac 等字段的值做一次過濾,得到有效的信息:

const isValid = (item) => item.internal === false && !isZeroMac(item.mac);
登錄后復制

但是對于 VPN、虛擬機等存在虛擬網卡的場景下,僅根據該信息無法進行有效區分。

2. 根據虛擬網卡 Mac 特征過濾

如果能夠得到虛擬網卡的特征,則可基于相關特征點進行識別與過濾。

基于某內部項目長達六年的實踐積累以及參考 vscode 中類似的實現,我們得到了一個常見虛擬網卡默認 Mac 地址特征的列表,參考如下:

// see https://standards-oui.ieee.org/oui/oui.txt const virtualMacPrefix = new Set([   '00:05:69', // vmware1   '00:0c:29', // vmware2   '00:50:56', // vmware3   '00:1c:14', // vmware   '00:1c:42', // parallels1   '02:00:4c', // Microsoft Loopback Adapter (微軟回環網卡)   '00:03:ff', // microsoft virtual pc   '00:0f:4b', // virtual iron 4   '00:16:3e', // red hat xen , oracle vm , xen source, novell xen   '08:00:27', // virtualbox ]);
登錄后復制

于是可以據此實現一個是否為虛擬網卡的判斷方法 isVirtualMac

export function isMac(mac: string) {   return /^([da-f]{1,2}[:-]){5}([da-f]{1,2})$/i.test(mac); }  export function formatMac(mac: string) {   return String(mac).trim().toLowerCase().replace(/-/g, ':'); }  export function isVirtualMac(mac: string) {   return isMac(mac) && virtualMacPrefix.has(formatMac(mac).slice(0, 8)); }
登錄后復制

據此可對 getMac 方法改進如下:

function getMac(family = 'IPv4') {     const nif = networkInterfaces();     for (const list of Object.values(nif)) {         const item = list.find(d => !d.internal && !isZeroMac(d.mac) && (!d.family ||d.family === family) && !isVirtualMac(d.mac));         if (item) return item.mac;    }     return ''; }
登錄后復制

3. 根據描述關鍵字特征過濾

在 Windows 系統下,可以通過執行 ipconfig /allwmic nic get 命令得到所有網卡的詳情,其中包含了描述信息。

基于實踐經驗分析,我們總結了一個常見虛擬網卡描述關鍵字的特征列表,參考如下:

const virtualDescList = ['virtual', ' vpn ', ' ssl ', 'tap-windows', 'hyper-v', 'km-test', 'microsoft loopback'];
登錄后復制

若經過前述規則過濾之后仍然存在多個網卡信息,則可繼續獲取網卡詳情,并基于 virtualDescList 列表以嘗試進一步的過濾處理:

// 執行 wmic nic get 命令獲取所有網卡詳情 function getNetworkIFacesInfoByWmic() {   // 略 }  if (hasMutiMac(list)) {   const info = await getNetworkIFacesInfoByWmic();    list = list.filter(item => {     if (!info.config[item.mac]) return true;     const desc = String(info.config[item.mac].desc).toLowerCase();     return !virtualDescList.some(d => desc.includes(d));   }); }
登錄后復制

getNetworkIFacesInfoByWmic 方法的具體實現可以參見這里:

https://github.com/lzwme/get-physical-address/blob/main/src/getIFacesByExec.ts#L121

4. 按優先級規則排序

過濾方式會將視為無效的項排除,但是可能會因規則的誤差而導致最后得到的列表為空。為了避免這種可能現象的出現,可以將過濾排除改為優先級排序方式,最后取列表第一項視為最優選項。

排序方法實現示例:

/**  * sort by: !internal > !zeroMac(mac) > visual > family=IPv4   */ function ifacesSort(list: NetworkInterfaceInfo[]) {   return list.sort((a, b) => {     if (a.internal !== b.internal) return a.internal ? 1 : -1;     if (isZeroMac(a.mac) !== isZeroMac(b.mac)) return isZeroMac(a.mac) ? 1 : -1;      const isVirtualA = isVirtualMac(a.mac);     const isVirtualB = isVirtualMac(b.mac);     if (isVirtualA !== isVirtualB) return isVirtualA ? 1 : -1;      if (a.family !== b.family) return a.family === 'IPv6' ? 1 : -1;   }); }
登錄后復制

于是最終的邏輯大致如下:

  • 獲取全部網卡信息
  • 基于 iface 特征排序取得全部列表:en0 - mac, eth3 - linux, ethernet - windows 優先級更高
  • 基于 internal字段、虛擬網卡特征(mac)、family字段等進行排序
  • 對排序的結果進行基礎過濾:internal=trueisZeroMac
  • 若過濾后列表多于1個,則基于虛擬網卡特征繼續過濾
  • 若過濾結果仍多余1個,則基于描述特征繼續過濾
  • 取最終結果的第一項作為最優選擇

如何利用Node獲取物理網卡mac地址

5. 總結與參考

實際上社區里已經有 address、getmac和macaddress 等較為流行的相關庫,但它們都不涉及虛擬網卡的識別。 本文主要介紹了基于實踐經驗對虛擬網卡的識別處理方式,與 vscode 中的相關實現邏輯較為相似,但又增加了基于描述信息過濾的規則邏輯。

  • www.npmjs.com/package/add…
  • www.npmjs.com/package/get…
  • www.npmjs.com/package/mac…
  • github.com/sebhildebra…
  • github.com/microsoft/v…
  • github.com/lzwme/get-p…
  • lzw.me/a/nodejs-ge…

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
中文字幕第66页| 香蕉视频xxxx| 男人天堂网站在线| 亚洲热在线视频| 中文字幕线观看| 天天干天天爽天天射| 国产一二三四在线视频| 日本一本二本在线观看| 黄页网站在线观看视频| 久久久999免费视频| 成年人黄色片视频| 艹b视频在线观看| 国产乱女淫av麻豆国产| 公共露出暴露狂另类av| 国产精品va在线观看无码| 国产乱子伦精品无码专区| 久久这里只有精品23| 国产3p露脸普通话对白| 无码人妻丰满熟妇区毛片| 在线视频日韩一区 | 国产wwwxx| 男操女免费网站| 在线观看日本www| 人妻激情另类乱人伦人妻| 青春草国产视频| 亚洲不卡中文字幕无码| 波多野结衣天堂| 中文字幕 91| 欧美精品久久久久久久自慰| 男人靠女人免费视频网站| 99热手机在线| 大桥未久一区二区| 久久久久久久久久久久久久国产| 黄色免费网址大全| 人妻av无码专区| 日韩精品视频一二三| 成人性生活视频免费看| 在线免费av播放| 亚洲熟妇无码一区二区三区| 色播五月激情五月| 久激情内射婷内射蜜桃| 国产大片一区二区三区| 激情综合网婷婷| 99久热在线精品视频| xx欧美撒尿嘘撒尿xx| 国产中文字幕乱人伦在线观看| 911福利视频| 天天插天天操天天射| 久久国产午夜精品理论片最新版本| www.精品在线| 两根大肉大捧一进一出好爽视频| 久久6免费视频| 欧美黄色性生活| 无码aⅴ精品一区二区三区浪潮| 视频一区二区视频| 国产探花在线看| 欧美 日韩精品| a在线视频观看| 分分操这里只有精品| 97av中文字幕| 国产又大又长又粗又黄| 欧美日韩在线观看不卡| 欧美牲交a欧美牲交aⅴ免费真| 18禁裸男晨勃露j毛免费观看| 亚洲一区二区偷拍| 91精品视频国产| 午夜在线视频免费观看| 国产九九九视频| 欧美爱爱视频网站| 不卡中文字幕在线| 一级黄色免费在线观看| 亚洲国产精品影视| 免费不卡av网站| 老司机午夜免费福利视频| 成年人三级视频| 97中文字幕在线| 性欧美大战久久久久久久| 欧美啪啪免费视频| 国产第一页视频| 男生操女生视频在线观看| 五月天激情播播| 精品一区二区三区毛片| 日本a在线免费观看| 成人综合视频在线| 91人人澡人人爽人人精品| 欧美成人三级在线播放| 国产高清999| 男人日女人视频网站| 熟妇人妻无乱码中文字幕真矢织江| 久久综合伊人77777麻豆最新章节| 国产三级三级看三级| 欧美少妇一区二区三区| av高清在线免费观看| 中文字幕网av| 国产情侣第一页| aa在线免费观看| 色综合五月婷婷| 精品这里只有精品| 一女二男3p波多野结衣| 国产精品久久久久7777| 三级在线免费看| 精品少妇在线视频| 人人干人人干人人| 人妻久久久一区二区三区| 亚洲视频第二页| 日日碰狠狠添天天爽超碰97| 色片在线免费观看| 好吊妞无缓冲视频观看| 国产农村妇女精品久久| 欧美激情国产精品日韩| 亚洲欧美一二三| 一区二区在线免费看| 欧美精品色婷婷五月综合| 欧美性受黑人性爽| 五月婷婷六月丁香激情| 91视频最新入口| 日韩免费在线观看av| 小早川怜子一区二区三区| 日本成人中文字幕在线| 日韩五码在线观看| 无码毛片aaa在线| 国产精品v日韩精品v在线观看| 欧美专区第二页| 一起操在线视频| 热久久久久久久久| 交换做爰国语对白| 香蕉视频禁止18| 夫妻免费无码v看片| 日韩极品视频在线观看| 国产一二三区在线播放| 肉大捧一出免费观看网站在线播放 | 欧美日韩在线观看不卡| 免费看国产曰批40分钟| 僵尸世界大战2 在线播放| 97超碰人人看| 中文字幕线观看| 天天操天天干天天做| 性生活免费在线观看| 一区二区成人网| 午夜啪啪小视频| 婷婷中文字幕在线观看| 手机在线免费毛片| 51xx午夜影福利| www.av毛片| 免费 成 人 黄 色| 人妻无码视频一区二区三区| 午夜激情福利在线| 日韩肉感妇bbwbbwbbw| 一区二区三区欧美精品| 欧美国产日韩在线视频| 免费看日b视频| 激情综合网婷婷| 一级黄色高清视频| 国产情侣第一页| 91看片就是不一样| 亚洲一二三不卡| 日韩精品免费一区| 东京热加勒比无码少妇| 女同激情久久av久久| 日韩精品手机在线观看| av动漫在线观看| 一级黄色特级片| 男女超爽视频免费播放| 狠狠躁狠狠躁视频专区| 欧美一级中文字幕| 波多野结衣作品集| 男人天堂网站在线| 欧美黄色性生活| av在线免费观看国产| 波多结衣在线观看| h无码动漫在线观看| 欧美美女性视频| 日韩视频免费播放| 在线观看中文av| 欧美激情国产精品日韩| av久久久久久| 999久久久精品视频| 成熟了的熟妇毛茸茸| 国产一级片中文字幕| 老熟妇仑乱视频一区二区 | 浴室偷拍美女洗澡456在线| 欧美两根一起进3p做受视频| 青青在线视频免费观看| www.污污视频| 欧美伦理片在线观看| 国产男女无遮挡| 国产av人人夜夜澡人人爽麻豆| 日韩精品aaa| 九色porny自拍| 看欧美ab黄色大片视频免费| 久久这里只有精品18| 亚洲五码在线观看视频| 五月天视频在线观看| 91丨九色丨蝌蚪| 亚洲第一狼人区| 中文字幕在线视频精品| 色一情一区二区三区| wwwwwxxxx日本| 在线免费看污网站| 免费成人黄色大片|