使用Python唤醒Lan

时间:2015-02-27 12:40:03

标签: python network-programming wake-on-lan

我正在使用WakeOnLan功能编写应用于网络上的Switch On Systems。

我用Google搜索并能够从here获取代码。我的代码如下所示。 我已经在我的路由器中转发了端口9。

我已启用来自电源管理的网卡的Wake On Lan选项。我按照here

的说明进行操作

我已经从here安装了Wake on Lan Monitor / Sniffer来检查我是否能够接收魔法数据包以进行唤醒。系统正在接收魔术包。当我从同一网络上的另一个系统(笔记本电脑)关闭并运行WOL python脚本时,我的系统无法启动。

有人可以建议我解决。

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

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

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')

3 个答案:

答案 0 :(得分:0)

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

我也有这样的经验:在大多数笔记本电脑上,您需要插上电源,并且在关闭电源之前还要将以太网电缆插入计算机才能正常工作。

要测试它是否可以在您的计算机上运行,​​请下载现有软件以发送WO​​L Magic Packets,并确保在您假设代码中出现问题之前它可以正常工作。

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

sudo apt-get install etherwake

然后再做

wakeonlan MAC-ADDRESS

答案 1 :(得分:0)

我知道这个帖子已经老了,但是你设法让它运作起来吗? 首先,我看到你使用的是Win8.1 根据维基百科:

  

“从混合关闭状态(S4)或完全关闭状态唤醒的能力   在Windows 8及更高版本中不支持电源关闭状态(S5),[20] [21]   和Windows Server 2012及更高版本。[22]这是因为改变了   操作系统行为导致网络适配器明确不   当关闭到这些状态时,为WOL设防。 WOL从睡梦中醒来   支持状态(S3)或非混合休眠状态(S4)。“

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

编辑:我刚刚创建了一个小型python应用程序,它使用的是'!'操作员与否。因此,我不确定以下几行:

另外,我发现您使用了包中的默认字节顺序:

struct.pack('BBBBBB',

你不应该使用'>'要么 '!' (big-endian / network)运营商?

e.g。

struct.pack('!BBBBBB',

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

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

答案 2 :(得分:0)

我使用wireshark来追踪我的WOL包

我测试了我的代码并且它有效。

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

(就像我之前说的那样)

如果要访问远程PC以关闭或检查登录状态

或登录

你需要在远程电脑的重新设置中添加一些东西

see this picture to see where to add in regestry

(也)就像我之前说过的那样:)

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

你可以用cmd检查一下发送一个shutdown -s -m \ ipadressOfTheRemotePC

我刚刚创建了一些大型软件来唤醒其他电脑

检查是否已登录,如果其中一个已登录,则不会为您执行此操作。

我用于wol数据包的代码是:

see this picture of my code