使用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中装饰器的一个妙用
Feb 08 Python
Python连接PostgreSQL数据库的方法
Nov 28 Python
python操作 hbase 数据的方法
Dec 18 Python
python基本语法练习实例
Sep 19 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
Jan 16 Python
Python中跳台阶、变态跳台阶与矩形覆盖问题的解决方法
May 19 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
python中time库的实例使用方法
Oct 31 Python
python matplotlib实现将图例放在图外
Apr 17 Python
Django serializer优化类视图的实现示例
Jul 16 Python
python matlab库简单用法讲解
Dec 31 Python
LeetCode189轮转数组python示例
Aug 05 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 && 逻辑与运算符使用说明
2010/03/04 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
33道php常见面试题及答案
2015/07/06 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
解决Laravel无法使用COOKIE和SESSION的问题
2019/10/16 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
jQuery实现仿QQ头像闪烁效果的文字闪动提示代码
2015/11/03 Javascript
JS实现CheckBox复选框全选、不选或全不选功能
2020/07/28 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
2017/10/26 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
python版微信跳一跳游戏辅助
2018/01/11 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
python之生成多层json结构的实现
2020/02/27 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
Python实现AI换脸功能
2020/04/10 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
小学生红领巾广播稿
2014/01/21 职场文书
培训专员岗位职责
2014/02/26 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
市场部岗位职责范本
2015/04/15 职场文书
草房子读书笔记
2015/06/29 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
手残删除python之后的补救方法
2021/06/26 Python