Como enviar apenas um pacote UDP com netcat?

120

Quero enviar apenas um valor curto em um pacote UDP, mas executando o comando

echo -n "hello" | nc -4u localhost 8000

Posso ver que o servidor está recebendo o material hello , mas preciso pressionar Ctrl+ cpara sair do comando netcat.

Como posso encerrar após enviar um alô ?


Desculpe, pelo barulho, eu reli a página do manual e encontrei a -qopção.

 echo -n "hello" | nc -4u -q1 localhost 8000

funciona (fecha após 1 segundo).

Por algum motivo, ele não funciona -q0.

Janne H
fonte
Página de -q seconds: after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever.
manual

Respostas:

204

Se você estiver usando o bash, você também pode escrever

echo -n "hello" >/dev/udp/localhost/8000

e evitar todas as idiossincrasias e incompatibilidades do netcat.

Isso também funciona enviando para outros hosts, por exemplo:

echo -n "hello" >/dev/udp/remotehost/8000

Estes não são dispositivos "reais" no sistema de arquivos, mas apelidos "especiais" de bash . Há informações adicionais no Manual do Bash .

Peter Eisentraut
fonte
24
Ok, você está certo, deixe-me apenas deixar explícito que isso não funcionará com ZSH.
jturolla de
1
Isso é muito melhor do que limpar com o netcat. Obrigado pela dica!
johnboiles
3
Esta pode ser a coisa mais incrível que já vi.
freb
4
Por alguma razão, eu precisava usar 127.0.0.1em vez disso, localhostno Ubuntu 14.04. (Sim, eu tenho localhostem /etc/hosts.)
tuomassalo
3
/dev/udp/não é um arquivo real. É apenas um nome de arquivo interpretado especialmente por bash.
Peter Eisentraut
46

Não encontrei a -q1opção no meu netcat. Em vez disso, usei a -w1opção. Abaixo está o script bash que fiz para enviar um pacote udp para qualquer host e porta:

#!/bin/bash

def_host=localhost
def_port=43211

HOST=${2:-$def_host}
PORT=${3:-$def_port}

echo -n "$1" | nc -4u -w1 $HOST $PORT
TraderJoeChicago
fonte
OS X funciona assim: "echo -n" test "| nc -4u -w0 localhost 9999" como diz SimonW
Simon Unsworth
14

Em um netcat atual (v0.7.1), você tem um switch -c:

-c, --close                close connection on EOF from stdin

Conseqüentemente,

echo "hi" | nc -cu localhost 8000

deve fazer o truque.

Simon
fonte
3
É importante observar que isso é verdadeiro apenas para GNU netcat, mas não para BSD netcat.
MarSoft
Para maior clareza, com o netcat baseado em Linux, a opção -c requer um comando como um argumento, que "executa o argumento fornecido via / bin / bash" - commandlinux.com/man-page/man1/nc.1.html
Blake Neal
5

O Netcat envia um pacote por nova linha. Então você está bem. Se você fizer algo mais complexo, talvez precise de outra coisa.

Eu estava brincando com o Wireshark quando percebi isso. Não sei se isso ajuda.

Evan
fonte
3
Acho que isso é correto apenas para TCP. Com o UDP, ele enviará várias linhas em um pacote (se caberem).
sleske
1
Não. Basta testar echo -n "hello\nworld" >/dev/udp/localhost/514e você obterá 2 linhas
bebbo
5

Tive o mesmo problema mas utilizo a -w 0opção de enviar apenas um pacote e desisto. Você deve usar este comando:

echo -n "hello" | nc -4u -w0 localhost 8000
Sajjad Baeidi
fonte
nc 1.10-41 + b1 não aceita -w0. Erro: tempo de espera inválido 0
palik