使用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运行的17个时新手常见错误小结
Aug 07 Python
python连接oracle数据库实例
Oct 17 Python
python字符串中的单双引
Feb 16 Python
python实现各进制转换的总结大全
Jun 18 Python
浅析Python3爬虫登录模拟
Feb 07 Python
Python 16进制与中文相互转换的实现方法
Jul 09 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
python装饰器相当于函数的调用方式
Dec 27 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
Feb 14 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
Python爬虫实例——爬取美团美食数据
Jul 15 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简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
jQuery 事件队列调整方法
2009/09/18 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
开业主持词
2014/03/21 职场文书
明星员工获奖感言
2014/08/14 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
政府会议通知范文
2015/04/15 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
实用求职信模板范文
2019/05/13 职场文书
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
Fluentd搭建日志收集服务
2022/09/23 Servers