Bash однострочная команда для отправки волшебного пакета wake on LAN без специального инструмента

Можно ли создать бодрствование по магическому пакету LAN и отправить его только в команде с одной строкой bash?

Конечно, я знаю, что для решения этой проблемы есть конкретные инструменты, которые решают проблему в одной строке, но было бы полезно знать минимальные требования для ковки WOL. Это: как справиться с пробуждением по локальной сети без специальных инструментов.

Ответы

Ответ 1

минимальные требования Я могу подумать:

  • Bash поддержка расширения скобок (я думаю, что это v3.5.1 и выше).
  • Команда sed (1).
  • NetCat.

Предполагая, что:

  • пакет WOL для локальной сети, переданный по адресу 255.255.255.255.

Командная строка :

echo -e $(echo $(printf 'f%.0s' {1..12}; printf "$(echo $MAC | sed 's/://g')%.0s" {1..16}) | sed -e 's/../\\x&/g') | nc -w1 -u -b 255.255.255.255 4000

Заменить $MAC на MAC-адрес назначения. Или, на этот раз в команде с двумя слоями:-):

MAC=11:22:33:44:55:66
echo -e $(echo $(printf 'f%.0s' {1..12}; printf "$(echo $MAC | sed 's/://g')%.0s" {1..16}) | sed -e 's/../\\x&/g') | nc -w1 -u -b 255.255.255.255 4000

Итак, в более общей нотации:

MAC=11:22:33:44:55:66
Broadcast=255.255.255.255
PortNumber=4000
echo -e $(echo $(printf 'f%.0s' {1..12}; printf "$(echo $MAC | sed 's/://g')%.0s" {1..16}) | sed -e 's/../\\x&/g') | nc -w1 -u -b $Broadcast $PortNumber

Пояснения:

  • Волшебный пакет WOL состоит из ffffffffffff (12 раз f), за которым следует 16-кратный MAC-адрес назначения без двоеточий (:).
  • Команда sed используется здесь для удаления двоеточий (:) из MAC и для добавления спецификатора \x hex > (так что 11 становится \x11, 22 становится \x22... и т.д.) перед отправкой строки в сетевой стек.
  • Пакет поддельного следа по локальной сети отправляется в сетевой стек , который связывает его с NetCat. SoCat можно использовать вместо этого (синтаксис будет отличаться, конечно).

Протестировано работает на Ubuntu, Kali и даже CygWin (Windows 7 SP 1 64 бит).

Рассматривать:

  • Версия CygWin NetCat не нужна для параметра -b.
  • Версия NetCat OpenBSD имеет ошибку на сегодняшний день (Juy 2015) для отправки широковещательных данных (-b), поэтому вам придется заменить ее на версию NetCat Traditional (пакет netcat-традиционный на apt-get installers).
  • В этом примере используется UDP-порт 4.000. определенный номер порта, по-видимому, не важен для WOL.
  • Вышеуказанная однострочная команда bash должна работать также для пробуждения по локальной сети через интернет. В этом случае замените адрес $Broadcast целевым общедоступным IP-адресом и откройте/переместите указанный $PortNumber (UDP) в пункт назначения.
  • echo -e можно заменить на printf.

Волновая цепочка WOL для приведенного выше примера:

FFFFFFFFFFFF112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566

(1) Ну, действительно, sed явно не требуется. Он используется здесь для удаления ':' и добавления \x к каждой паре символов в закодированной цепочке магического пакета. Я знаю, что есть способы заменить sed на некоторое расширение оболочки или так.