使用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中的rfind()方法使用详解
May 19 Python
Python教程之全局变量用法
Jun 27 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
Dec 10 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
Python KMeans聚类问题分析
Feb 23 Python
python实现一组典型数据格式转换
Dec 15 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
python pandas模块基础学习详解
Jul 03 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
python matplotlib拟合直线的实现
Nov 19 Python
python文件和文件夹复制函数
Feb 07 Python
python 字典和列表嵌套用法详解
Jun 29 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
Terran热键控制
2020/03/14 星际争霸
第十节--抽象方法和抽象类
2006/11/16 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
2019/01/27 jQuery
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
Python使用py2exe打包程序介绍
2014/11/20 Python
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
python自动下载图片的方法示例
2020/03/25 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
opencv-python的RGB与BGR互转方式
2020/06/02 Python
如何利用python发送邮件
2020/09/26 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
运动会通讯稿200字
2014/02/16 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
golang生成并解析JSON
2022/04/14 Golang