使用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 相关文章推荐
Python实现基于权重的随机数2种方法
Apr 28 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
深入浅出学习python装饰器
Sep 29 Python
基于Python中numpy数组的合并实例讲解
Apr 04 Python
Numpy中的mask的使用
Jul 21 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
解决django中ModelForm多表单组合的问题
Jul 18 Python
Python中os模块功能与用法详解
Feb 26 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
Python自动巡检H3C交换机实现过程解析
Aug 14 Python
让文件路径提取变得更简单的Python Path库
May 27 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中的比较运算符详解
2013/10/28 PHP
重新认识php array_merge函数
2014/08/31 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript dom 操作详解 js加强
2009/07/13 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
Jquery同辈元素选中/未选中效果的实例代码
2013/08/01 Javascript
js中的this关键字详解
2013/09/25 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python合并字符串的3种方法
2015/05/21 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
python matplotlib拟合直线的实现
2019/11/19 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
html5简介及新增功能介绍
2020/05/18 HTML / CSS
zooplus波兰:在线宠物店
2019/07/21 全球购物
高校学生干部的自我评价分享
2013/11/04 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
运动会运动员赞词
2015/07/22 职场文书
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技