使用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中用datetime包进行对时间的一些操作
Jun 23 Python
python win32 简单操作方法
May 25 Python
python读取csv文件并把文件放入一个list中的实例讲解
Apr 27 Python
多个应用共存的Django配置方法
May 30 Python
python 读取文件并替换字段的实例
Jul 12 Python
Python并发之多进程的方法实例代码
Aug 15 Python
Python中is和==的区别详解
Nov 15 Python
对Pandas MultiIndex(多重索引)详解
Nov 16 Python
Python类装饰器实现方法详解
Dec 21 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
解决.ui文件生成的.py文件运行不出现界面的方法
Jun 19 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 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防止图片盗用(盗链)的方法小结
2016/11/11 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
百度留言本js 大家可以参考下
2009/10/13 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
JS实现自动变换的菜单效果代码
2015/09/09 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
2016/12/19 Javascript
js 获取今天以及过去日期
2017/04/11 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
python数据结构树和二叉树简介
2014/04/29 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
浅谈python的输入输出,注释,基本数据类型
2019/04/02 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
估算杭州有多少软件工程师
2015/08/11 面试题
大学专科生推荐信范文
2013/11/23 职场文书
商务主管岗位职责
2013/12/08 职场文书
英语生日邀请函
2014/01/23 职场文书
文明班集体申报材料
2014/05/23 职场文书
学习礼仪心得体会
2014/09/01 职场文书
研修心得体会
2014/09/04 职场文书
Python time库的时间时钟处理
2021/05/02 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
OpenCV实现常见的四种图像几何变换
2022/04/01 Python