Python 实现远程开机与关机:WOL 魔法数据包详解
本文介绍如何使用 Python 实现远程开关机功能。远程开机基于 WOL(Wake-On-Lan)技术,通过发送包含目标 MAC 地址的 Magic Packet 广播包唤醒计算机。文章详细解析了网卡供电、端口配置及代码实现,并提供了局域网或公网环境下的关机方案,包括命令行执行与 Flask 服务调用。
Python 远程开关机概述
利用 Python 执行关机操作或许并不陌生,但通过 Python 实现远程开机则相对少见。本文将介绍一种基于网络协议的神奇方法,展示如何使用 Python 代码触发计算机开机。
相关 GitHub 仓库地址:
https://github.com/injetlee/Python/tree/master/Python%20%E9%BB%91%E9%AD%94%E6%B3%95
本文目标
- 远程开机原理
- Python 远程开机代码实现
- Python 关机说明
Python 远程开机实现
Python 开机
程序实现开机的核心在于 WOL(Wake-On-Lan,局域网唤醒)技术。该机制利用计算机在关机或休眠状态下,主板与网卡仍保持微弱供电的特性(前提是电源已连接且使用有线网络)。此时网卡具备监听外部广播信息的能力,一旦接收到特定格式的数据包,便会触发开机指令。目前主流主板均支持此功能。
只需在网络适配器属性中配置以下两个选项即可启用相关功能。


注意,图中所示的勾选选项不应选中。我们需要确保网卡在关机后仍保持供电状态,具体表现为关机后网口指示灯依然亮起。若指示灯熄灭,则无法实现远程唤醒。

这种特定格式的数据包被称为 Magic Packet(魔法数据包),通常通过 UDP 协议进行广播,端口号一般为 7 或 9。Magic Packet 的结构以连续 6 个 "FF FF FF FF FF FF" 开头,随后紧跟目标计算机的 MAC 地址信息。网卡侦测到该数据包内容后,即执行开机操作。
接下来查看具体代码实现。该部分涉及 UDP 网络编程,后续章节将专门探讨网络编程相关内容。此函数仅需输入目标计算机的 MAC 地址即可运行。在局域网环境中(若拥有公网 IP,亦可应用于公网),在另一台计算机上执行此程序,目标计算机即可自动开机。
具体代码如下,代码逻辑简洁,原理直观:
def wake_up(mac='DC-4A-3E-78-3E-0A'):
MAC = mac
BROADCAST = "192.168.0.255"
if len(MAC) != 17:
raise ValueError("MAC address should be set as form 'XX-XX-XX-XX-XX-XX'")
mac_address = MAC.replace("-", '')
data = ''.join(['FFFFFFFFFFFF', mac_address * 20]) # 构造原始数据格式
send_data = b''
# 把原始数据转换为16进制字节数组,
for i in range(0, len(data), 2):
send_data = b''.join([send_data, struct.pack('B', int(data[i: i + 2], 16))])
print(send_data)
# 通过socket广播出去,为避免失败,间隔广播三次
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.sendto(send_data, (BROADCAST, 7))
time.sleep(1)
sock.sendto(send_data, (BROADCAST, 7))
time.sleep(1)
sock.sendto(send_data, (BROADCAST, 7))
print("Done")
except Exception as e:
print(e)
Python 远程关机方案
Python 关机
相比之下,远程关机更为简单,网上已有多种现成解决方案。常见方法是通过程序扫描邮箱,若收到包含关机关键词的邮件,则自动执行关机命令。此外,若仅在局域网内操作,或拥有公网 IP,也可在本地计算机启动服务(例如使用 Flask 运行在 5000 端口),通过向该地址发送指令来触发关机。本机程序中只需包含执行关机的命令即可。
import os
os.system('shutdown -s -t 00')
以上即为 Python 远程开关机方法的详细内容,更多关于 python 远程开关机的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









