使用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 10 Python
Python获取系统默认字符编码的方法
Jun 04 Python
Python中几个比较常见的名词解释
Jul 04 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
pandas表连接 索引上的合并方法
Jun 08 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
Python列表的切片实例讲解
Aug 20 Python
解决Python import docx出错DLL load failed的问题
Feb 13 Python
Python 私有属性和私有方法应用场景分析
Jun 19 Python
python与js主要区别点总结
Sep 13 Python
Python基础之变量的相关知识总结
Jun 23 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
实用函数9
2007/11/08 PHP
PHP教程 基本语法
2009/10/23 PHP
php使用base64加密解密图片示例分享
2014/01/20 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
js 判断 enter 事件
2009/02/12 Javascript
javascript 简练的几个函数
2009/08/29 Javascript
关于this和self的使用说明
2010/08/01 Javascript
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
2015/03/13 Javascript
KnockoutJs快速入门教程
2016/05/16 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
Bootstrap源码解读按钮(5)
2016/12/23 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
python构建深度神经网络(DNN)
2018/03/10 Python
Python实现的简单计算器功能详解
2018/08/25 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
python Paramiko使用示例
2020/09/21 Python
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
游戏商店:Eneba
2020/04/25 全球购物
幼儿园新年寄语
2014/04/03 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
小学校本培训方案
2014/06/06 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
实习协议书
2015/01/27 职场文书
图书借阅制度范本
2015/08/06 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js
python munch库的使用解析
2021/05/25 Python