首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python的Lan上的WakeUp

使用Python的Lan上的WakeUp
EN

Stack Overflow用户
提问于 2015-02-27 20:40:03
回答 3查看 16.5K关注 0票数 0

我写了一个应用程序来使用WakeOnLan功能打开网络上的系统。

我在谷歌上搜索了一下,并从here上找到了代码。我的代码如下所示。我还转发了路由器中的端口9。

我已从电源管理中为网卡启用了Lan唤醒选项。我遵循了here的指示

我已经安装了来自here的唤醒局域网监视器/嗅探器,以检查我是否能够接收魔法包来唤醒。系统正在接收魔术数据包。当我关机并从同一网络上的另一个系统(笔记本电脑)运行WOL python脚本时,我的系统不能通电。

有谁能给我提个解决方案。

我的系统是带有Win 8.1的台式机,需要在Lan上唤醒。装有Win8的笔记本电脑需要运行应用程序并将魔术数据包发送到桌面。

我的LAN IP范围为172.16.0.1等,因此使用172.16.255.255作为广播地址。

代码语言:javascript
复制
import sys, struct, socket

# Configuration variables
broadcast = ['172.16.255.255']
wol_port = 9

known_computers = {
    'mercury'    : '00:1C:55:35:12:BF',
    'venus'      : '00:1d:39:55:5c:df',
    'earth'      : '00:10:60:15:97:fb',
    'mars'       : '00:10:DC:34:B2:87',
}

def WakeOnLan(ethernet_address):

    # Construct 6 byte hardware address
    add_oct = ethernet_address.split(':')
    if len(add_oct) != 6:
        print "\n*** Illegal MAC address\n"
        print "MAC should be written as 00:11:22:33:44:55\n"
        return
    hwa = struct.pack('BBBBBB', int(add_oct[0],16),
        int(add_oct[1],16),
        int(add_oct[2],16),
        int(add_oct[3],16),
        int(add_oct[4],16),
        int(add_oct[5],16))

    # Build magic packet

    msg = '\xff' * 6 + hwa * 16

    # Send packet to broadcast address using UDP port 9

   soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    soc.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)
    for i in broadcast:
        soc.sendto(msg,(i,wol_port))
    soc.close()

def wol(*macs):
    if len(macs) == 0:
        print "\n*** No computer given to power up\n"
        print "Use: 'wol computername' or 'wol 00:11:22:33:44:55'"
    else:
        for i in macs:
            if i[0] != '/':
                if ":" in i:
                    # Wake up using MAC address
                    WakeOnLan(i)
                else:
                    # Wake up known computers
                    if i in known_computers:
                        WakeOnLan(known_computers[i])
                    else:
                        print "\n*** Unknown computer " + i + "\n"
                        quit()

        if len(macs) == 2:
            print "\nDone! The computer should be up and running in a short while."
        else:
            print "\nDone! The computers should be up and running in a short while."
        print

wol('My System MAC address')
EN

回答 3

Stack Overflow用户

发布于 2015-02-27 20:47:54

您需要检查系统是否对获取WOL数据包做出反应,而不仅仅是检查它是否能够接收(即实际唤醒)。如果没有,您需要通过特殊软件或在计算机的BIOS设置中打开它。

我也有经验,在大多数笔记本电脑上,你需要插上电源,还需要在电脑上插上以太网线,然后才能正常工作。

要测试它是否能在您的计算机上运行,请下载用于发送WOL Magic数据包的现有软件,并确保它在您的代码中出现错误之前运行。

在Linux (基于debian的例子)中,你需要做的就是:

sudo apt-get install etherwake

然后做

wakeonlan MAC-ADDRESS

票数 0
EN

Stack Overflow用户

发布于 2016-08-22 19:44:25

我知道这个帖子很旧,但是你能让它工作吗?首先,根据维基百科,我发现你使用的是Win8.1:

“在Windows 8及更高版本、20和Windows Server 2012及更高版本中不支持从混合关机状态(S4)或完全断电状态(S5)唤醒的功能。22这是因为操作系统行为的更改导致网络适配器在关机到这些状态时明确不支持WOL。支持从睡眠状态(S3)或非混合休眠状态(S4)唤醒WOL。”

因此,我建议尝试使用不同的机器/操作系统,并确保在BIOS中启用了WoL选项。

编辑:我刚刚做了一个小的python应用程序,无论我使用“!”不管是不是运算符。因此,我对以下几行不太确定:

另外,我看到你在包中使用了默认的字节顺序:

代码语言:javascript
复制
struct.pack('BBBBBB',

你不是应该用“>”或“!”吗?(big-endian / network)运营商?

例如:

代码语言:javascript
复制
struct.pack('!BBBBBB',

我担心如果您不使用big-endian运算符,它将默认使用您的系统编码方式,而在Intel机器上,它将是little-endian编码方案。所以你发送字节的顺序是错误的。

https://docs.python.org/3.0/library/struct.html https://en.wikipedia.org/wiki/Endianness

票数 0
EN

Stack Overflow用户

发布于 2016-10-31 00:24:02

我使用wireshark跟踪我的WOL数据包

我测试了我的代码,它可以工作。

对于Windows8+中的wol,您必须取消选中快速启动

(就像我之前说的)

如果您想访问远程pc以进行关机或检查登录状态

或登录

您需要在远程pc上向regestry中添加一些内容

see this picture to see where to add in regestry

(也)就像我之前说的:)

如果不这样做,就不能进行远程访问(拒绝访问(5))

您可以使用命令send a shutdown -s -m \ipadressOfTheRemotePC进行检查

我刚开发了一些庞大的软件来唤醒另一台电脑

检查是否已登录,如果没有,则在两者都已登录的情况下它将为您执行此操作。

我的wol包使用的代码是:

see this picture of my code

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28765352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档