久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

如何利用Node獲取物理網(wǎng)卡mac地址

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

如何利用Node獲取物理網(wǎng)卡mac地址

node.js極速入門課程:進(jìn)入學(xué)習(xí)

在基于 Electron 的應(yīng)用中,有一個業(yè)務(wù)需求是獲取物理網(wǎng)卡的 Mac 地址以用于客戶機(jī)唯一性識別。

剛接到需求時你可能會想,這還不簡單,調(diào)用 Node.js 的 os 模塊提供的 networkInterfaces API 就行了。【相關(guān)教程推薦: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 ''; }
登錄后復(fù)制

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

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

原來開 VPN 的時候使用了虛擬網(wǎng)卡,此時你才發(fā)現(xiàn)事情并沒有那么簡單。實(shí)際上,在存在 VPN、虛擬機(jī)等場景下,都可能會使用到虛擬網(wǎng)卡。

1. 根據(jù) networkInterfaces 返回值的字段值過濾

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

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

但是對于 VPN、虛擬機(jī)等存在虛擬網(wǎng)卡的場景下,僅根據(jù)該信息無法進(jìn)行有效區(qū)分。

2. 根據(jù)虛擬網(wǎng)卡 Mac 特征過濾

如果能夠得到虛擬網(wǎng)卡的特征,則可基于相關(guān)特征點(diǎn)進(jìn)行識別與過濾。

基于某內(nèi)部項目長達(dá)六年的實(shí)踐積累以及參考 vscode 中類似的實(shí)現(xiàn),我們得到了一個常見虛擬網(wǎng)卡默認(rèn) 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 (微軟回環(huán)網(wǎng)卡)   '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 ]);
登錄后復(fù)制

于是可以據(jù)此實(shí)現(xiàn)一個是否為虛擬網(wǎng)卡的判斷方法 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)); }
登錄后復(fù)制

據(jù)此可對 getMac 方法改進(jìn)如下:

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 ''; }
登錄后復(fù)制

3. 根據(jù)描述關(guān)鍵字特征過濾

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

基于實(shí)踐經(jīng)驗(yàn)分析,我們總結(jié)了一個常見虛擬網(wǎng)卡描述關(guān)鍵字的特征列表,參考如下:

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

若經(jīng)過前述規(guī)則過濾之后仍然存在多個網(wǎng)卡信息,則可繼續(xù)獲取網(wǎng)卡詳情,并基于 virtualDescList 列表以嘗試進(jìn)一步的過濾處理:

// 執(zhí)行 wmic nic get 命令獲取所有網(wǎng)卡詳情 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));   }); }
登錄后復(fù)制

getNetworkIFacesInfoByWmic 方法的具體實(shí)現(xiàn)可以參見這里:

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

4. 按優(yōu)先級規(guī)則排序

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

排序方法實(shí)現(xiàn)示例:

/**  * 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;   }); }
登錄后復(fù)制

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

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

如何利用Node獲取物理網(wǎng)卡mac地址

5. 總結(jié)與參考

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

  • 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)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
精品在线99| 久久久国产精品入口麻豆| 成人欧美一区二区三区的电影| 国产一区二区三区天码| 国产亚洲一区二区手机在线观看| 欧美久久精品一级c片| 亚洲精品九九| 国产一区二区三区日韩精品 | 欧美精品观看| 久久久久久一区二区| 在线亚洲国产精品网站| 国产亚洲高清在线观看| 日韩精品专区| 国产亚洲电影| 红桃视频国产精品| 日韩av福利| 日韩一二三区在线观看| 国产在线观看www| 中文字幕av亚洲精品一部二部| 国产精品日韩精品中文字幕| 亚洲五月婷婷| 韩国女主播一区二区三区| 亚洲精品伊人| 欧美精品羞羞答答| 久久精品天堂| 日产欧产美韩系列久久99| 亚洲天堂一区二区| 国产精品久久久网站| 麻豆成人在线| 日韩在线视频精品| 国产剧情在线观看一区| 久久电影一区| 伊人成人在线视频| 久久激情网站| 日韩专区精品| 国产成人精品亚洲线观看| 日日夜夜免费精品视频| 国产亚洲一级| 午夜欧美精品| 狠狠干成人综合网| 99在线观看免费视频精品观看| 老牛影视精品| 欧美sm一区| 香蕉精品久久| 久久久久国产精品一区二区| 中文字幕高清在线播放| 色乱码一区二区三区网站| 精品国产亚洲一区二区三区大结局| 国产日韩欧美中文在线| 国产亚洲一区二区三区不卡| 久久国产欧美日韩精品| 久久不见久久见中文字幕免费| 国产精品久久国产愉拍| 六月丁香综合在线视频| 色综合狠狠操| 亚洲天堂1区| 国产亚洲精品v| 久久国际精品| 日韩免费在线| 欧美日韩国产精品一区二区亚洲| 伊人久久亚洲影院| 日韩在线网址| 蜜桃精品视频| 精品免费av在线| 亚洲欧美久久| 国产精品sss在线观看av| 成人福利一区 | 亚洲综合二区| 欧美日韩一视频区二区| 精品三级久久久| 欧美网站在线| 国产精品嫩草影院在线看| 欧美国产美女| 亚洲一卡久久| 麻豆国产欧美日韩综合精品二区| 欧美成人基地| 欧美一级一区| 五月天综合网站| 国产精品网在线观看| 91精品推荐| 久久伊人久久| 免费在线成人网| 天堂√8在线中文| 日韩精品一区二区三区免费视频 | 亚洲一级淫片| 日韩在线短视频| 四虎精品永久免费| 亚洲精品小说| 中文字幕一区久| 国产日韩欧美三区| av不卡在线看| 日韩精品中文字幕第1页| **爰片久久毛片| 蜜桃久久精品一区二区| 中文字幕在线看片| 国产欧美日韩影院| 亚洲图片久久| 不卡在线一区二区| 色婷婷狠狠五月综合天色拍| 国产精品4hu.www| 日本午夜精品视频在线观看| 一区二区视频欧美| 性欧美xxxx免费岛国不卡电影| 国产精品观看| 欧美日韩1区2区3区| 蜜桃av一区二区| 男人的天堂久久精品| 免费精品国产的网站免费观看| 98精品久久久久久久| 国产一区二区三区91| 国产精品欧美三级在线观看 | 亚洲另类av| 蜜桃视频一区二区三区| 亚洲欧美不卡| 亚洲人妖在线| 热久久久久久| 久久国产精品免费一区二区三区| 日韩黄色av| 你懂的网址国产 欧美| 久久精品人人| 久久精品官网| 久久久久中文| 美女91精品| 日本高清久久| 久久av超碰| 国产+成+人+亚洲欧洲在线| av日韩中文| 黑丝一区二区三区| 中文字幕亚洲精品乱码| 青青国产精品| а√天堂中文在线资源8| 日韩精品免费一区二区三区| 99视频+国产日韩欧美| 国产视频一区二| 国产精品成人一区二区不卡| 久久影视一区| 亚洲精品福利| 国产精品国产一区| 色88888久久久久久影院| 免费欧美在线视频| 麻豆中文一区二区| 亚洲成人三区| 久久久久黄色| 免费在线观看精品| 国产一区调教| 蜜桃传媒麻豆第一区在线观看 | 99香蕉国产精品偷在线观看 | 国产欧美视频在线| 美女久久久久| 久久中文字幕一区二区三区| 久久高清免费观看| 国产精品99在线观看| 日韩欧美中文字幕一区二区三区| 欧美三区四区| 国产精品17p| 日韩国产欧美在线播放| 亚洲精品成人| 精品免费av在线| 国产精品分类| 在线一区二区三区视频| 国产白浆在线免费观看| 国产精品高潮呻吟久久久久| 六月婷婷一区| 亚洲激情二区| 99国产精品免费视频观看| 久久精品一区二区国产| 日韩精品成人在线观看| 99国产精品久久久久久久| 日韩欧美一区二区三区在线视频 | 久久国产亚洲精品| 国产精品网站在线看| 亚洲v天堂v手机在线| 午夜在线一区二区| 丝袜脚交一区二区| 在线亚洲成人| 午夜在线精品偷拍| 亚洲激情欧美| 四虎在线精品| 国产伦乱精品| 欧美激情日韩| 国产成人久久| 欧美色图国产精品| 亚洲免费在线| 日韩有吗在线观看| 欧美日韩网址| 国产精品66| 91看片一区| 久久午夜精品一区二区| 蜜桃传媒麻豆第一区在线观看| 日韩欧美中文字幕一区二区三区| 日韩和欧美一区二区三区| 国产剧情一区| 久久男人av资源站| 亚洲精品国产偷自在线观看| 亚洲日本久久| 国产精品成人a在线观看| 国产高清一区二区| 日韩精品一区二区三区中文在线| 麻豆91小视频| 激情视频一区二区三区|