Windows公网远程开机

689 阅读2分钟

WOL

WOL(Wake On LAN - 局域网唤醒)开机,虽然这个功能叫局域网唤醒,但与路由器的端口映射功能配合,广域网唤醒也是很容易的。只要有一台能上网的电脑或手机,就能把家中电脑打开,需要用家里电脑又不在家的时候很方便。

WOL配置

前提

  • 主板支WOL,并且开启该功能。不同主板可以对应查询如何开启
  • 唤醒发起请求的设备与电脑在同一个网段(公网需要端口映射等方式确保主机接收到请求)

获取主机MAC地址

ipconfig /all找到对应设备的mac地址,例如:AA:BB:CC:DD:AD:AA

唤醒配置

有很多种方式可以唤醒,下面提供的是思路。

iOS/Android

最简单的是在局域网内,通过APP来唤醒,市场可以搜索对应的APP(WOL)

群晖

如果有一台长期运行的NAS,那么通过nas则可以执行下面的命令来唤醒主机 执行/usr/syno/sbin/synonet --wake AA:BB:CC:DD:AD:AA eth0可以唤醒

Jenkins

基于上面的前提,每次访问nas后台执行命令还是有点费劲的,如果Nas上启动一个Jenkins,外网进行端口映射,能够访问Jenkins的话,然后配置Job,执行上面的命令,则也可以通过网页访问Jenkins,然后开机。

Siri

更加进一步,有时候网页访问还是很麻烦,可以配置Siri来执行快捷指令,调用jenkins的webhook,调用执行开机的Job。这样不论何时何地(公网或者内网),就可以通过siri直接语音唤起主机。

编码

当然如果动手能力强一点,也可以通过代码来实现,例如python代码

# -*- coding: utf-8 -*-
import socket
import struct
from traceback import print_exc
 
DEFAULT_PORT = 7
DEFAULT_BOARDCAST = '192.168.1.255'
 
def send_magic_packet(addr):
    # create socket
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        # parse address
        mac_ = addr.upper().replace("-", "").replace(":", "")
        if len(mac_) != 12:
            raise Exception("invalid MAC address format: {}".format(addr))
        buf_ = b'f' * 12 + (mac_ * 20).encode()
        # encode to magic packet payload
        magicp = b''
        for i in range(0, len(buf_), 2):
            magicp += struct.pack('B', int(buf_[i:i + 2], 16))
 
        # send magic packet
        print("sending magic packet for: {}".format(addr))
        s.sendto(magicp, (DEFAULT_BOARDCAST, DEFAULT_PORT))
 
 
if __name__ == "__main__":
    try:
        # mac_addr = []
        mac_addr = "12:34:56:78:90:AB"
        send_magic_packet(mac_addr)
 
    except BaseException:
        print_exc()

上面提及更多是思路,或者说是我折腾的时候经历的过程,有很多其它类似的替代产品来实现,挑自己熟悉的就行。

目前我使用的路线是 Hi,Siri -> Jenkins Webhook -> shell -> 开机。

以上仅供参考