weoyk / note

0 stars 0 forks source link

远程唤醒局域网主机技术Wake-On-Lan​  ​编辑 嘿,各位程序员魔法师们!今天我要教你一个神奇的咒语,它能让你远 - 掘金 #7

Open weoyk opened 2 weeks ago

weoyk commented 2 weeks ago

  ​编辑

嘿,各位程序员魔法师们!今天我要教你一个神奇的咒语,它能让你远程唤醒沉睡中的电脑。没错,我们要学习的是 Wake-on-LAN(WoL)技术。想象一下,你可以像哈利·波特一样,挥动你的魔杖(键盘),让远方的电脑从睡梦中惊醒。酷毙了,对吧?

WOL用途

如果你在开发一个计算机管理软件(利旧现有主机,实现统一运维管理),例如电脑课开课前老师一键开启电教室的电脑 。

魔法原理

Wake-on-LAN 的原理其实很简单。我们发送一个特殊的网络包(俗称"魔术包"),包含目标电脑网卡的 MAC 地址。网卡收到这个包后,就会像被一桶冰水泼醒一样,启动整个系统。

准备材料

  1. Node.js(我们的魔法棒)
  2. 一台支持 WoL 的电脑
  3. 目标电脑的 MAC 地址

另外需要硬件开启,因为我要实现这个功能嘛,所以测试过四五台主机,发现BIOS默认就是开启的~然后需要注意的就是电池管理,台式机一般也是默认支持,但笔记本就需要检查是否开启省电模式,如果开启了,就找个机会偷偷给它改掉

编写代码= 绘制符咒

首先,我们需要一个强大的魔法函数。复制下面的代码,把它保存为 wakeOnLAN.js

const dgram = require('dgram')

function wakeOnLAN(macAddress, options = {}) {
  const {
    ipAddress = '255.255.255.255',
    port = 9,
    attempts = 5,
    interval = 100,
  } = options

  return new Promise((resolve, reject) => {
    const magicPacket = createMagicPacket(macAddress)
    const client = dgram.createSocket('udp4')
    let attemptsMade = 0

    function sendPacket() {
      client.send(magicPacket, 0, magicPacket.length, port, ipAddress, (err) => {
        if (err) {
          client.close()
          reject(err)
          return
        }

        attemptsMade++
        console.log(`尝试 ${attemptsMade}: 魔术包已发送!`)

        if (attemptsMade >= attempts) {
          client.close()
          resolve(`完成 ${attempts} 次唤醒尝试,希望公主已经醒了!`)
        } else {
          setTimeout(sendPacket, interval)
        }
      })
    }

    sendPacket()
  })
}

function createMagicPacket(macAddress) {
  if (!/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/.test(macAddress)) {
    throw new Error('MAC 地址格式不对哦,再检查一下呗!')
  }

  const cleanMac = macAddress.replace(/[:-]/g, '')
  const buffer = Buffer.alloc(102)
  
  buffer.fill(0xFF, 0, 6)
  
  for (let i = 1
    cleanMac.match(/.{2}/g).forEach((hex, j) => {
      buffer.writeUInt8(parseInt(hex, 16), i * 6 + j)
    })
  }

  return buffer
}

添加函数调用

wakeOnLAN('00:11:22:33:44:55', { attempts: 5, interval: 100 })
  .then(result => console.log(result))
  .catch(error => console.error('哎呀,魔法失效了:', error));

运行脚本=魔术施法

施法条件(每次都要确保下对方未开启法术盾哦~

  1. 确保目标电脑的 BIOS 中启用了 WoL 功能。(别问我怎么进 BIOS,那是另一个魔法课程的内容)
  2. 获取目标电脑的 MAC 地址。在 Windows 上运行 ipconfig /all,在 Mac/Linux 上运行 ifconfig。找到那串像 00:11:22:33:44:55 的神秘代码。

运行你的魔法脚本:

node wakeOnLAN.js

注意事项

  1. 如果魔法失效了,不要灰心。可能是网络阻塞了你的魔术包,多试几次。(UDP真的会丢包)
  2. 记住,滥用魔法是会受到惩罚的。不要用于恶作剧。

结课!

恭喜你!你现在已经掌握了远程唤醒电脑的魔法,下次再面对有计算机利旧集群管理时,就不会手足无措啦~有些技术知道了便很简单呢

下次见,各位魔法师!祝你们魔力无边,代码无 bug!

这是新系列吧,好像我就是比较喜欢挖坑,内容主要是一些我觉得比较神奇小众的技术点,快速搞定业务顺便总结啦~

2cy

        YU.H