jpoliv / wakeonlan

Perl script for waking up computers via Wake-On-LAN magic packets
318 stars 31 forks source link

wakeonlan

pre-commit License: Artistic-2.0

This is some premature documentation for this project. Feel free to contact with comments or additions (good or bad).

Authors:

Table of contents:

  1. What is wakeonlan
  2. How does WOL work?
  3. How is it implemented here?
  4. Known to work hardware
  5. Installation
  6. Usage
  7. Contributing
  8. Copyright and license
  9. References

1. What is wakeonlan

This script sends 'magic packets' to wake-on-lan enabled ethernet adapters, in order to switch on the called PC.

2. How does WOL work?

WOL is based on the following principle :

When the PC shuts down, the NIC still gets power, and keeps listening on the network for a 'magic' packet to arrive. This packet must contain a certain byte-sequence, but can be encapsulated in any kind of packet (IPX, IP, anything). Take a look at the code for the magic sequence.

This program uses UDP for sending the packet. The complete UDP packet, sent over an ethernet interface, looks something like this

[Ethernet header][IP header][UDP header][Magic sequence][CRCS]

The only goal of the script is to send this packet over the network. It expects no returning data, since the NIC only listens, and does not reply anything.

For a more detailed description of the Magic Packet technology, check the AMD resources listed in the references section.

3. How is it implemented here?

The scripts takes 2 arguments, the MAC-address of the NIC, and an IP address. The IP-address is tricky :

For a NIC on your local subnet, use the broadcast-address of this subnet. (e.g. subnet 192.168.10.0 with netmask 255.255.255.0, use 192.168.10.255)

For waking up a PC on a network behind one or more routers, some tricks must be used. When the routers forward directed subnet broadcasts, it is possible to use the broadcast address of the destination network. The problem is that many routers don't forward broadcast packets, so the packet will never arrive at the network.

It is possible to send the packet to the remote net however, by sending it to the IP address of another host on that network that's alive at that moment. The remote hosts will probably ignore the packet, but it has been seen by the listening NIC that's also on the same subnet, and it will turn on the computer... Feel free to experiment on this.

4. Known-to-work hardware

5. Installation

5.1 Installation of the wakeonlan script from the tarball

On a Linux or on a MacOS system navigate to a temporary directory like /tmp and execute the following commands:

curl -RLOJ https://github.com/jpoliv/wakeonlan/archive/refs/tags/v0.42.tar.gz
tar zxvf wakeonlan-0.42.tar.gz
cd wakeonlan-0.42
perl Makefile.PL
make
make install

5.2 Downloading the standalone wakeonlan script directly from GitHub

On a Linux or on a MacOS system navigate to a directory like ~/.local/bin and execute the following commands:

curl -RLOJ https://github.com/jpoliv/wakeonlan/raw/refs/heads/master/wakeonlan
chmod a+x wakeonlan
./wakeonlan --help

Note that the wakeonlan script uses an unversioned perl pathname on its shebang line (/usr/bin/perl) that you may have to be adjust if your system has a versioned perl interpreter like /usr/bin/perl5.38.

6. Usage

Sending a magic packet using the limited broadcast address as the target IPv4 address (limited broadcast address: 255.255.255.255):

wakeonlan 01:02:03:04:05:06

or using a subnet broadcast address as the target IPv4 address:

wakeonlan -i 192.168.1.255 01:02:03:04:05:06

or specifying a different destination port (default port: discard(9)):

wakeonlan -i 192.168.1.255 -p 1234 01:02:03:04:05:06

For more examples check the script POD documentation by running wakeonlan --help or perldoc wakeonlan.

7. Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

8. Copyright and license

Copyright (c) 2000-2024 José Pedro Oliveira.

This is free software. You may modify it and distribute it under the Perl's Artistic License 2.0. Modified versions must be clearly indicated.

9. References