Python WOL/WakeOnLan/网络唤醒数据包发送工具

按照WOL协议规定,在电脑处于关机而网卡供电状态下,从网络上接收到WOL魔法包后会自动加电开机。这种方式能够很方便的使用在需要进行远程管理的环境中。此程序实现了网络唤醒的魔法数据包发送功能,可以实现远程开机。

假设需要被唤醒PC网卡MAC地址为:01:02:03:04:05:06 则WOL魔法包结构如下:

FF FF FF FF FF FF | 01 02 03 04 05 06 ...重复16次... 01 02 03 04 05 06 | 00 00 00 00 00 00

前段的6字节0xff 和尾部的 6字节0x00 无需变化照抄即可,数据包总长度:108 字节

通过把以上数据包发送到本地子网的广播地址(代码中为:192.168.1.255)的UDP端口9即可唤醒该PC

注意:此代码需要python解释器运行,Windows/Linux/Mac OS 通用

使用方法:

1. 保存以下代码到 wol.py

#!/usr/bin/env python
#coding=utf-8

import socket, sys
import struct
def to_hex_int(s):
    return int(s.upper(), 16)
 
dest = (‘192.168.1.255‘, 9)
 
if len(sys.argv) < 2:
 print("usage: %s <MAC Address to wakeup>" % sys.argv[0])
 sys.exit()
 
mac = sys.argv[1]
 
spliter = ""
if mac.count(":") == 5: spliter = ":"
if mac.count("-") == 5: spliter = "-"
 
if spliter == "":
 print("MAC address should be like XX:XX:XX:XX:XX:XX / XX-XX-XX-XX-XX-XX")
 sys.exit()
 
parts = mac.split(spliter)
a1 = to_hex_int(parts[0])
a2 = to_hex_int(parts[1])
a3 = to_hex_int(parts[2])
a4 = to_hex_int(parts[3])
a5 = to_hex_int(parts[4])
a6 = to_hex_int(parts[5])
addr = [a1, a2, a3, a4, a5, a6]
 
packet = chr(255) + chr(255) + chr(255) + chr(255) + chr(255) + chr(255)
 
for n in range(0,16):
 for a in addr:
  packet = packet + chr(a)
 
packet = packet + chr(0) + chr(0) + chr(0) + chr(0) + chr(0) + chr(0)
 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
s.sendto(packet,dest)
 
print("WOL packet %d bytes sent !" % len(packet))

2. 使用方法为命令行下执行(linux/Mac可以不需要写命令最开始的python):

python ./wol.py 01:02:03:04:05:06
时间: 2024-09-27 04:38:18

Python WOL/WakeOnLan/网络唤醒数据包发送工具的相关文章

网络数据包发送工具PacketSender中文源码

在网上发现了一个好用的工具PacketSender,数据包发送器.对于写网络程序来说,有很大的便利性.虽然在linux下,netcat工具也很好用,但是这个也不错. 原本是英文的,给翻译了一下.这是基于QT开发的.有一些翻译不对的地方,还请指正. 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso 下面是翻译后的源码包,下载地址 实际上是一个bzip包,因为博客园不支持bz2文件

Windows下底层数据包发送实战

1.简介 所谓“底层数据包”指的是在“运行”于数据链路层的数据包,简单的说就是“以太网帧”,而我们常用的Socket只能发送“运行”在传输层的TCP.UDP等包,这些传输层数据包已经能满足绝大部分需求,但是有些时候还是需要发送底层数据包的(例如SYN扫描),那么如何发送呢? 本文记录了我试图实现的过程中遇到的一些问题以及解决办法,需要注明:①本文只考虑Windows上的实现  ②本文主要目的是实现发送部分  ③本文假定读者理解网络分层结构和一些基本的网络编程方法  ④本文只是在讨论常规技术,切勿

外网主机怎样将数据包发送到共用一个公网IP的局域网某特定主机上的

内网的一台电脑要上因特网对外开放服务或接收数据,都需要端口映射.端口映射分为动态和静态. 动态端口映射:内网中的一台电脑要访问网站,会向NAT网关发送数据包,包头中包括对方网站IP.端口和本机IP.端口,NAT网关会把本机IP.端口替换成自己的公网IP.一个未使用的端口,并且会记下这个映射关系,为以后转发数据包使用.然后再把数据发给网站,网站收到数据后做出反应,发送数据到NAT网关的那个未使用的端口,然后NAT网关将数据转发给内网中的那台电脑,实现内网和公网的通讯.当连接关闭时,NAT网关会释放

外网主机如何将数据包发送到共用一个公网IP的局域网某特定主机上的

内网的一台电脑要上因特网对外开放服务或接收数据.都须要port映射.port映射分为动态和静态. 动态port映射:内网中的一台电脑要訪问站点.会向NAT网关发送数据包.包头中包含对方站点IP.port和本机IP.port,NAT网关会把本机IP.port替换成自己的公网IP.一个未使用的port.而且会记下这个映射关系,为以后转发数据包使用.然后再把数据发给站点,站点收到数据后做出反应.发送数据到NAT网关的那个未使用的port.然后NAT网关将数据转发给内网中的那台电脑,实现内网和公网的通讯

数据包发送

解析 socket 函数 SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) { int retval; struct socket *sock; int flags; ...... if (SOCK_NONBLOCK != O_NONBLOCK && (flags & SOCK_NONBLOCK)) flags = (flags & ~SOCK_NONBLOCK) | O_NONBLOCK; ret

python+jinja2实现接口数据批量生成工具

在做接口测试的时候,我们经常会遇到一种情况就是要对接口的参数进行各种可能的校验,手动修改很麻烦,尤其是那些接口参数有几十个甚至更多的,有没有一种方法可以批量的对指定参数做生成处理呢. 答案是肯定的! python的jinja2模板库可以很好的满足我们的需求,通过维护一个原始数据模板,将我们想要动态生成的变量模板化,就可以实现需求. 现在我们有这样的一个请求数据 { "abc":"123", "p2p":"123", "

python基础学习日志day8-socket发送大数据包问题

一:什么是socket大数据包发送问题 socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果.这就出现象第一次接受结果不全,第二次接果出现第一次结果. 比如send 1900 数据,recv 只接受1024.多于数据900放在缓存区里,第二次命令来的时候,调用send会先把900发回去,在把新数据放到缓存区,等到1024在系统会自动发送过去. 发送数据,一是缓存区满,二是超时 解决办法: 在发送数据前,计算发送数据的大小,把大小发给对方.

发送和接收数据包

发送和接收数据包 原文:Game Networking系列,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年. 概述 在之前的网游中的网络编程系列1:UDP vs. TCP中(推荐先看前面那篇),我们经过讨论得出:网游中传输数据应该使用UDP而不是TCP.我们选择UDP是为了不需要等待重发数据包,从而达到数据的实时性. 注意,因为接下来英文原文中所有的代码是C++写的,而我是个pythoner,我的计划是:通过理解文章,我用python实现UDP收发数据包.虚拟连接(原文后两章的

Linux网络之设备接口层:发送数据包流程dev_queue_xmit

转自:http://blog.csdn.net/wdscq1234/article/details/51926808 写在前面 本文主要是分析kernel-3.8的源代码,主要集中在Network的netdevice层面,来贯穿interface传输数据包的流程,kernel 博大精深,这也仅仅是一点个人愚见,作为一个笔记形式的文章,如有错误或者表述不当之处,还请大家留言批评指正,非常感谢! 主要涉及的file:kernel-3.18/net/core/dev.c kernel-3.18/net