WOL снаружи WAN - PullRequest
       16

WOL снаружи WAN

3 голосов
/ 12 июня 2011

Некоторое время назад я написал [с некоторой помощью от Google] небольшой скрипт WOL для включения компьютеров в моей сети.Вот сценарий:

exec /usr/bin/python -x "$0" "$@"
#
node_lst = [
        'srv1 0a:1b:8c:0d:2e:7f',
        'srv2 0A-0B-4C-8D-CE:3F',
]
#
import os,sys,string,commands
import struct, socket
import re,random

retval = 0

mac_addr = "mac_addr.txt"
X = '([a-zA-Z0-9]{2}[:|\-|.]?){5}[a-zA-Z0-9]{2}'
S = re.compile(r'\s+')

mmap = {}

## First argument 'None' in str.translate is new in 2.6. 
## Previously, it was a string of 256 characters 
if sys.version_info < (2, 6):
    f1_arg = ''.join(chr(i) for i in xrange(256))
else:
    f1_arg = None

## broadcast address
sysOS = "uname -s"
BSD = "ifconfig | grep -w broadcast | cut -d\  -f 6"
LNX = "ip -o addr show | grep -w inet | grep -e eth | cut -d\  -f 9"
#
if commands.getoutput(sysOS) == "Linux":
    bCast = commands.getoutput(LNX)
elif commands.getoutput(sysOS) == "Darwin":
    bCast = commands.getoutput(BSD)
else:
    print "System not supported!!"
    sys_exit()

def WakeOnLan(mac_address):

    ## Building the Wake-On-LAN "Magic Packet"...
    ## Pad the synchronization stream.
    data = ''.join(['FFFFFFFFFFFF', mac_address * 20])
    msg = ''

    ## Split up the hex values and pack.
    for i in range(0, len(data), 2):
        msg = ''.join([msg, struct.pack('B', int(data[i: i + 2], 16))])

    ## ...and send it to the broadcast address using UDP
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
    s.sendto(msg, (bCast, 9))
    s.close()

def sys_exit():
    sys.stdout.flush()
    sys.exit(1)

## check if hostname is provided
if len(sys.argv) != 2:
    print "Usage: %s <hostname>" % sys.argv[0]
    sys_exit()

for i in node_lst:
    # strip off everything from first "#" [if] found
    i = i.split('#',1)[0]
    if not re.search(X, i):
        continue

    h = S.split(i,1)[0]                 ## host name
    m = S.split(i,1)[-1]                ## MAC address
    mmap[h] = m.strip('\t|" "')

for j, k in mmap.iteritems():
    if sys.argv[1] == j:
        if not re.search(X.replace('zA-Z','fA-F'), k):
            print "Invalid MAC address [",k,"]; nothing to do!!"
            sys_exit()
        else:
            WakeOnLan(k.translate(f1_arg,':.-'))
            print "WOL request has been sent to %s [%s]" % (j,k)
            break
else:
    print "Host [%s] doesn't exist!!" % sys.argv[1]
    sys_exit()

, который прекрасно работает из моей домашней сети (или локальной сети).Как я могу изменить скрипт, чтобы он работал за пределами моей локальной сети?Любая идея или предложения?Ура !!

Ответы [ 2 ]

1 голос
/ 08 июня 2012

Настройте маршрутизатор для пересылки пакетов по выбору из 10 непоследовательных портов на компьютер в вашей локальной сети.

Разработать некоторую схему, основанную, скажем, по времени GMT + хеш для генерации последовательности запуска порта.

Имейте программу Python (используйте scappy) в вашем командном окне внутри этой сети, чтобы прослушать серию пакетов syn.

Код слушателя будет аналогичен следующему синтаксису tcpdump:

sudo tcpdump -ni eth0 'tcp[tcpflags] & (tcp-syn) !=0'

Где он захватывает только син пакеты.

Ваша программа просто сидит там, ожидая правильной синхронизации. Когда он получает последовательность, он запускает ваш скрипт WOL.

Готово.

Если вы не хотите открывать порты, ваш скрипт может вместо этого опросить удаленный веб-сайт, ожидая изменений. Или прослушайте электронную почту, полученную по электронной почте.

Развивая свою идею, вы могли бы заняться модными вещами, такими как включение света или загрузка телевизора.

1 голос
/ 12 июня 2011

Это невозможно, поскольку пакеты WOL являются широковещательными пакетами (поскольку вы тоже не можете знать, кому его отправлять).Домашние маршрутизаторы и особенно интернет-провайдеры / сетевые маршрутизаторы отбрасывают все широковещательные пакеты, потому что в противном случае каждый раз, когда вы запускаете этот один сценарий, все компьютеры во всем Интернете получат ваш пакет, что может вызвать некоторый беспорядок.

Что вы, конечно, можетеДля этого нужно написать небольшое приложение, которое находится на компьютере, работающем внутри WAN, в котором вы хотите включить все компьютеры, и затем заставить это приложение отправить пакет WOL.Однако для этого потребуется постоянно включать компьютер с доступом в Интернет.

...