środa, 31 lipca 2019

Wake On LAN, czyli wybudzanie komputera po sieci

Solucja jest dla Ubuntu czy Mac, potrzebny jest jeden komputer z włączoną obsługą Wake On LAN i to będzie ten nasz śpiący.

Po stronie śpiącego komputera [tego co będziemy chcieli wybudzić]:
w terminalu
sudo apt install ethtool
ifconfig

z polecenia wybieramy interfejs ethernet, który chcemy wybudzić oraz mac adres i sekcję broadcast:
enp2s0f0: flags=4163  mtu 1500
        inet 192.168.1.123  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 ----::----:----:----:----  prefixlen 64  scopeid 0x20
        ether 98:f2:b3:e7:00:00  txqueuelen 1000  (Ethernet)
        RX packets 48  bytes 6817 (6.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 82  bytes 12600 (12.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 33  


z tego powyżej w naszym przypadku będzie to enp2s0f0 [nazwa interfejsu]broadcast 192.168.1.255 [rozgłaszanie], ether 98:f2:b3:e7:00:00 [czyli mac adres]

następnie tworzymy serwis/usługę do nasłuchiwania wybudzania, żeby była dostępna.
przechodzimy do 
/etc/systemd/system

w katalogu tworzymy plik o nazwie wol.service
poleceniem 
sudo nano wol.service
przepisujemy to poniżej oraz zmieniamy enp2s0f0 na własną z ifconfig:
---

[Unit]
Description=Configure Wake-up on LAN

[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s enp2s0f0 wol g

#w ExecStart wpisujemy nazwę swojego interfejsu zamiast przykładowego enp2s0f0

[Install]
WantedBy=basic.target

---
ctrl-o [zapisujemy] ctrl-x [wychodzimy]

Dodajemy poleceniem naszą usługę:
systemctl daemon-reload
włączamy usługę:
systemctl enable wol.service
uruchamiamy:
systemctl start wol.service

==koniec zabaw po stronie śpiącego i po spisaniu nazwy interfejsu, adresu broadcast, mac adresu można go wyłączyć, po wyłączeniu lampka od ethernetu powinna się świecić [przynajmniej w moim przypadku tak jest i nie jest to wina usługi, a funkcji Wake On LAN zaszytej w BIOS]==

Po stronie wybudzacza potrzebujemy skrypt pythona tworzymy plik sudo nano wol.py lub dowolnym edytorem tekstu "dla ludzi", a w nim po hashu wyjaśniam co zmieniać:
---

#! /usr/bin/python

# wol
#
# Wake on LAN
#
# Use:
# wol computer1
# wol computer1 computer2
# wol 00:11:22:33:44:55
#
# Author: San Bergmans
#         www.sbprojects.net
#

import sys, struct, socket

# Configuration variables - z ifconfig pomiędzy '' wpisujemy nasz adres broadcast
broadcast = ['192.168.1.255', '192.168.0.255']
wol_port = 9

# w tej części wpisać nazwę komputera oraz jego mac adres format trzeba zachować czyli 'mariola' : 'ma:ca:dr:es:s0' nazwa komputera może być dowolna, mac musi być zgodny z tym komputerem co mamy wybudzić. jak widać poniżej takich komputerów można mieć 4 w tym skrypcie tj. mercury, venus, earth, mars

known_computers = {
    'mercury'    : '98:F2:B3:E7:00:00',
    'venus'      : '98:F2:B3:E7:00:00',
    '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()

if len(sys.argv) == 1:
    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 sys.argv:
        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(sys.argv) == 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

---
następnie zapisujemy i wychodzimy z edytora nano lub innego dozwolonego. Nadajemy prawa wykonywania naszego skryptu:
sudo chmod +x wol.py
Uruchamiamy skrypt poleceniem:
python wol.py mercury
lub
python wol.py ma:ca:dr:es:s0
lub
python wol.py mercury venus [wybudzi 2 komputery]

Parametry zależą od tego co wpisaliśmy w skrypcie wol.py w sekcji known_computers

Komputer z włączoną obsługą Wake On LAN powinien nam się wybudzić, oczywiście jak jest wyłączony. Skrypty nie są mojego autorstwa i pochodzą ze stron poniżej, ja jedynie pozmieniałem co jest dla mnie ważne czyt. dodałem polskie komentarze.

Jest jeszcze dostępny nieco prostszy skrypt pod tym adresem:
https://scripts.itarian.com/frontend/web/topic/wake-on-lan
wystarczy mac adres zmienić w sekcji list1 i powinno działać [oczywiście trzeba dać prawa wykonywania takiego skryptu].

źródła:

Brak komentarzy:

Prześlij komentarz