Wake-on-LAN com BusyBox?

8

É possível implementar o pacote mágico wake-on-lan no bash? Estou usando um BusyBox antigo e personalizado e não tenho ether-wake . É possível substituí-lo por algum outro comando shell, como:

wakeonlan 11:22:33:44:55:66
    
por michelemarcon 10.02.2012 / 14:58

3 respostas

7

Você precisa de algo que seja capaz de enviar um pacote Ethernet que será visto pelo dispositivo que você deseja ativar.

O comando ether-wake no BusyBox é exatamente o que você está procurando. Se o seu BusyBox não o tiver, considere recompilar o BusyBox para incluí-lo.

Se você tiver um netcat suficientemente "inchado" (BusyBox pode ter uma das duas implementações nc , uma das quais lida somente com TCP), você pode enviar um pacote UDP criado manualmente para o endereço de broadcast do segmento de rede que o dispositivo está conectado a.

mac=$(printf '\xed\xcb\xa9\x87\x65\x43') # MAC = ed:cb:a9:87:65:43
wol_packet=$(printf "\xff\xff\xff\xff\xff\xff$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac")
echo "$wol_packet" | nc -u 7 192.0.2.255

Outro utilitário BusyBox que você poderia abusar para enviar esse pacote é syslogd .

syslogd -n -O /dev/null -l 0 -R 192.0.2.255/7 &
syslogd_pid=$!
logger "$wol_packet"
kill $!

Se o MAC contiver um byte nulo, você não poderá criar o pacote tão facilmente. Escolha um byte que não seja \xff e que não esteja no MAC, digamos \x42 ( B ), e passe por tr .

echo "$wol_packet" | tr B '
echo "$wol_packet" >/dev/udp/192.0.2.255/7
0' | nc -u 7 192.0.2.255

Se você realmente tem bash (o que é extremamente incomum em dispositivos com BusyBox - você tem certeza que realmente tem bash, e não outro shell fornecido pelo BusyBox?), ele pode enviar pacotes UDP redirecionando para /dev/udp/$hostname/$port .

mac=$(printf '\xed\xcb\xa9\x87\x65\x43') # MAC = ed:cb:a9:87:65:43
wol_packet=$(printf "\xff\xff\xff\xff\xff\xff$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac")
echo "$wol_packet" | nc -u 7 192.0.2.255
    
por 11.02.2012 / 22:50
1

/dev/udp é reconhecido pelo bash e não existe realmente no sistema de arquivos, então tente.

Acho que você pode usar syslogd sem -l switch, desde que suporte -R .

Eu tenho o busybox com syslogd com -R , não nc nem bash e ainda estou presa.

    
por 08.01.2013 / 11:39
0

Eu tenho um servidor ssh em execução no antigo sonho da HTC. Minha versão do busybox também não inclui ether-wake e eu não sou habilidoso o suficiente para compilar meu próprio busybox. Felizmente consegui acordar meu PC usando:

bash
cat mac2.txt | tr B '
bash
cat mac2.txt | tr B '%pre%0' >/dev/udp/192.0.1.255/7
0' >/dev/udp/192.0.1.255/7

Observe que o ip da transmissão é diferente na minha rede.

Criei o arquivo (mac2.txt) contendo o pacote mágico no meu PC e o enviei para o servidor via SFTP. Como meu mac tem byte nulo, eu tenho que usar tr para substituir todos os bytes x42 por 00. Funcionou como charme.

    
por 11.09.2013 / 13:38