使用Python实现Wake On Lan远程开机功能


Posted in Python onJanuary 22, 2020

Wake-On-LAN简称WOL,是一种电源管理功能;如果存在网络活动,则允许设备将操作系统从待机或休眠模式中唤醒。许多主板厂商支持IBM提出的网络唤醒标准。该标准允许网络管理员远程打开PC机电源,以便进行文件升级、资源跟踪和设备清点等工作。

先看下使用Python实现WakeOn Lan远程开机功能,具体介绍如下:

创建魔法唤醒包

格式化mac地址,生成魔法唤醒包,然后发送包,首先电脑需要打开wake on lan功能

创建main_wake_on_lan.py文件

import socket
import binascii
import struct
import re
'''
格式化mac地址,生成魔法唤醒包,然后发送。
mac格式: mac = A1B2C3D4E5F6
唤醒包格式: send_data = binascii.unhexlify('FF'*6 + str(mac)*16)
'''
MAC = "18:31:BF:B0:36:8F"

# MAC = "98-90-96-C1-FE-CB"

# 格式化MAC地址989096C1FECB为这种形式
def format_mac0(mac):
 if len(mac) == 12:
  pass
 elif len(mac) == 17:
  if mac.count(':') == 5 or mac.count('-') == 5:
   sep = mac[2]
   mac = mac.replace(sep, '')
  else:
   raise ValueError('Incorrect MAC format')
 else:
  raise ValueError('Incorrect MAC format')
 return mac
def format_mac(mac):
 mac_re = re.compile(r'''
      (^([0-9A-F]{1,2}[-]){5}([0-9A-F]{1,2})$
      |^([0-9A-F]{1,2}[:]){5}([0-9A-F]{1,2})$
      |^([0-9A-F]{1,2}[.]){5}([0-9A-F]{1,2})$
      )''', re.VERBOSE | re.IGNORECASE)
 # print(re.match(mac_re, mac))
 if re.match(mac_re, mac):
  if mac.count(':') == 5 or mac.count('-') == 5 or mac.count('.'):
   sep = mac[2]
   mac_fm = mac.replace(sep, '')
   return mac_fm
 else:
  raise ValueError('Incorrect MAC format')

# 方法一:将989096C1FECB格式的mac地址创建唤醒包
def create_magic_packet0(mac):
 data = b'FF' * 6 + (mac * 16).encode()
 print(data)

 print(type(data))
 send_data = b''
 for i in range(0, len(data), 2):
  send_data = send_data + struct.pack(b'B', int(data[i: i + 2], 16)) # int(data[i: i+2], 16) 把16进制转换成整数
 print(type(send_data))
 return send_data
# 方法二:将989096C1FECB格式的mac地址创建唤醒包,使用binascii.unhexlify()方法
def create_magic_packet(mac):
 data = 'FF' * 6 + str(mac) * 16
 # print(data)
 # print(type(data))
 send_data = binascii.unhexlify(data)
 # print(type(send_data))
 return send_data
def send_magic_packet(send_data):
 # broadcast_address = '192.168.255.255'
 broadcast_address = '255.255.255.255'
 port = 9
 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
 s.sendto(send_data, (broadcast_address, port))
if __name__ == '__main__':
 # print('mac地址:', format_mac(MAC))
 mac = format_mac(MAC)
 send_data = create_magic_packet(mac)
 # print(send_data)
 send_magic_packet(send_data)

调用发包函数

创建main_boot_computer.py

import main_wake_on_lan
import sys


def boot_computer():
 try:
  pyname, parameter = sys.argv
  if parameter == '-h':
   print('参数使用方法:python3 main_boot_computer.py mac地址\npython3 main_boot_computer.py 98:90:96:C1:FE:CB')
  else:
   print('正在向 ', parameter, ' 发送魔法唤醒包!')
   # mac = '98:90:96:C1:FE:CB'

   mac = main_wake_on_lan.format_mac(parameter)
   send_data = main_wake_on_lan.create_magic_packet(mac)

   main_wake_on_lan.send_magic_packet(send_data)
   return '成功向' + parameter + '发送唤醒包!'
 except ValueError:
  print('未收到传入的参数\n获取帮助:python3 main_boot_computer.py -h')

if __name__ == '__main__':
 boot_computer()

使用方法

python3 main_boot_computer.py mac地址

补充:python通过wakeonlan唤醒内网电脑开机

首先需要pip3 install wakeonlan

然后在电脑需要你的网卡支持网络唤醒计算机。

然后在主板BIOS开启支持唤醒。

在系统网卡属性里选上“允许计算机关闭此设备以节约电源”,“允许此设备唤醒计算机”

然后以下就是python代码,非常简单。

from wakeonlan import send_magic_packet
send_magic_packet('4d.2d.6b.12.9b.1f')

总结

以上所述是小编给大家介绍的使用Python实现Wake On Lan远程开机功能,希望对大家有所帮助!

Python 相关文章推荐
有关wxpython pyqt内存占用问题分析
Jun 09 Python
基于Python实现文件大小输出
Jan 11 Python
Python利用IPython提高开发效率
Aug 10 Python
使用python获取csv文本的某行或某列数据的实例
Apr 03 Python
Python3实现的字典、列表和json对象互转功能示例
May 22 Python
对python中for、if、while的区别与比较方法
Jun 25 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
python字符串判断密码强弱
Mar 18 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 Python
Python+logging输出到屏幕将log日志写入文件
Nov 11 Python
Python中Matplotlib的点、线形状、颜色以及绘制散点图
Apr 07 Python
python定义类self用法实例解析
Jan 22 #Python
通过实例解析python描述符原理作用
Jan 22 #Python
python基于property()函数定义属性
Jan 22 #Python
Python @property装饰器原理解析
Jan 22 #Python
Python底层封装实现方法详解
Jan 22 #Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 #Python
使用tensorboard可视化loss和acc的实例
Jan 21 #Python
You might like
提升PHP执行速度全攻略(上)
2006/10/09 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
浅谈Python的文件类型
2016/05/30 Python
pyqt5实现登录界面的模板
2020/05/30 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
值传递还是引用传递
2015/02/08 面试题
学生自我评价范文
2014/02/02 职场文书
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
综治维稳工作汇报
2014/10/27 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python