É possível ecoar caracteres diretamente para a rede?

3

Mesmo quando este é um problema de rede, eu diria que esta é uma questão de usuários experientes em Unix / Linux.

Estou tentando enviar manualmente um pacote mágico de rede usando echo e redirecionadores (descritores de arquivo).
Este é um exemplo dos dados que devem ser enviados via rede broadcast (para 255.255.255.255) para ativar o computador com MAC 00: 17: 31: 3F: D3: A9 (FFFFFFFFFFFF seguido por 16 vezes o MAC sem cólon):

ffffffffffff0017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a9

Enviei um wake on LAN magic packet dos meus programas habituais ( IH WOL ou wakeonlan tool para Linux) que funcionou bem, e eu capturei o tráfego de rede com WireShark:

Observeaáreaverdeemdestaque:opacotemágicoécorretamenteenviadocomoHex.

Eagoraéhoradométodoredirecionadoresecho.
EstouecoandoopacotemágicoparatransmitirendereçoIP,protocoloUDP,númerodeporta4000:

exec6<>/dev/udp/255.255.255.255/4000echo"ffffffffffff0017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a90017313fd3a9" >&6

Nenhum resultado (o computador remoto não acorda). A captura do WireShark é desta vez um pouco diferente :

Comopodeservisto,opacotemágicoagoraestánoladodireito(!),osupostobinaryareadainformação.Naáreaàesquerda,cadaFaparececomo66(seucódigoASCII,suponho),cada0como30...etc.
E,apropósito,osdadosnãosãodetectadoscomo"MagicPacket" pela WireShark.

Qual é a maneira correta de enviar meus dados via shell diretamente para a NIC?

P.S: talvez essa pergunta deva ser transferida para o ServerFault? Eu acho que é como um tipo de problema de conversão de hex ou ascii.

    
por Sopalajo de Arrierez 22.07.2015 / 01:14

1 resposta

4

Realmente fácil:

  • Adicione a especificação hexadecimal "\ x" a cada dois caracteres.
  • Use echo -e para hex ser interpretado . Você também pode usar printf porque echo faz coisas diferentes em diferentes shells.

Usando seus mesmos dados de exemplo:

echo -e "\xff\xff\xff\xff\xff\xff\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9\x00\x17\x31\x3f\xd3\xa9" >&6

Desta vez, o seu computador deve acordar.

  • OBSERVAÇÃO : nem todos os shells suportam esse recurso. Na verdade, apenas alguns fazem. Consulte este tópico saber qual deles faz. Para mim, a versão mais recente do Cygwin (junho de 2015) para o Windows executando Bash 4.3.39(2)-release (i686-pc-cygwin) funciona perfeitamente.
  • NOTE-2 : Infelizmente, o Ubuntu (v14.04) e o Kali (v1.1.0) parecem não suportá-lo como hoje, como explicado em este tópico . Ele provavelmente foi desativado no Bash, devido a problemas com compatibilidade de rede.
  • NOTE-3 : Bem, devo admitir que as pessoas (ver tópicos acima) relatando que /dev/protocol/host/port não é um método adequado estão completamente certas. Por exemplo, o código hexadecimal \x0a atua como algum código de controle para datagramas de rede, dividindo o pacote. Então você não pode usar o endereço MAC como 0a:11:22:33:44:55 com este método. Hora de mudar para netcat ou socat .
por 22.07.2015 / 01:14