Что такое магический пакет Wake on LAN?

Wake on LAN включает спящий или выключенный компьютер по сети. Сетевая карта компьютера остаётся включённой и ожидает магический пакет: 6 байтов FF, за которыми 16 раз повторяется MAC-адрес компьютера, всего 102 байта. Обычно пакет отправляется как широковещательная UDP-рассылка на порт 9 или 7, поэтому его получают все устройства в локальной сети, но просыпается только устройство с совпадающим адресом. Сначала Wake on LAN нужно включить в настройках BIOS или UEFI компьютера.

Пакет отправляют такие инструменты, как wakeonlan и etherwake, но они установлены не всегда, а на сервер или NAS их может быть нежелательно добавлять.

Описание инструмента

Этот инструмент формирует однострочную команду, которая отправляет пакет с помощью уже имеющихся в Linux средств. Введите MAC-адрес компьютера, который нужно разбудить, в формате 00:11:22:AA:BB:CC, 00-11-22-AA-BB-CC, 0011.22AA.BBCC или в виде 12 идущих подряд шестнадцатеричных цифр, а затем выберите способ отправки в поле «Отправить с помощью»:

  • Python 3 или Perl — работают в bash и zsh, не требуют root-доступа и поддерживают широковещательную рассылку
  • Bash /dev/udp — не требует установки дополнительных компонентов, но работает только в bash, не в zsh, и не поддерживает широковещательную рассылку

По умолчанию для широковещательного или IP-адреса используется 255.255.255.255, а для UDP-порта — 9. Если bash отправляет пакет на широковещательный адрес, Linux отвечает сообщением «Доступ запрещён». Поэтому инструмент предупредит вас, если вы выберете Bash и укажете адрес, оканчивающийся на .255. Вместо него укажите IP-адрес самого компьютера.

Команда формируется в браузере. Скопируйте её и выполните на любом компьютере с Linux в той же сети.

Примеры

Для адреса 00:11:22:AA:BB:CC, широковещательная отправка через Python 3 на порт 9:

python3 -c 'import socket;s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM);s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1);s.sendto(bytes.fromhex("ff"*6+"001122aabbcc"*16),("255.255.255.255",9))'

Bash, прямая отправка на компьютер с адресом 192.168.1.20:

printf "$(printf '\\xff%.0s' {1..6})$(printf '\\x00\\x11\\x22\\xaa\\xbb\\xcc%.0s' {1..16})" > /dev/udp/192.168.1.20/9

Возможности

  • Варианты команды для Python 3, Perl и bash
  • Поддержка MAC-адресов с двоеточиями, дефисами, точками или без разделителей
  • Предупреждение, если вариант для bash не может отправить пакет на широковещательный адрес