bashwake-on-lan

Bash one-line command to send wake on LAN magic packet without specific tool


Is it possible to forge a wake on LAN magic packet and send it in just a one-line bash command?

Of course, I know there are specific tools for doing this that solve the problem in one line, but it could be useful to know the minimal requirements for WOL forging. This is: how to deal with wake on LAN without specific tools.


Solution

  • The minimum requirements I can think off:

    Assuming:

    The command line would be:

    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
    

    Replace $MAC by the destination MAC. Or, this time in a two-liner :-) command:

    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
    

    So, in a more generic notation:

    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
    

    Explanations:

    Tested working on Ubuntu, Kali and even CygWin (Windows 7 SP 1 64 bits ).

    To take under consideration:

    WOL magic packet string for the above example:

    FFFFFFFFFFFF112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566112233445566
    

    (1) Well, indeed, sed is not explicitly required. It is used here to remove ':' and add \x to each pair of characters in the magic packet's forged string. I know there are ways to replace sed by some shell expansion or so.