Estou tentando enviar uma mensagem netcat
. Depois de enviar a mensagem, netcat
deve terminar.
Eu tentei o seguinte:
cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin
A -q
opção declara:
-q segundos
após o EOF no stdin, aguarde o número especificado de segundos e saia. Se os segundos forem negativos, espere para sempre.
Mas
nc -q0 -u localhost 4300 < message.bin
também não funciona.
o que estou perdendo?
-q
.invalid wait-time 0
Sem a
-q
bandeira da sua instâncianetcat
irá esperar para sempre. Não há mensagem "fim do fluxo" com o UDP, portanto não há comonetcat
saber que o stdin e a conexão de rede foram finalizados.Por exemplo, usando TCP / IP, isso funciona conforme o esperado:
Mas, como você determinou, o uso de UDP / IP nunca termina:
É aqui que a
-q
bandeira entra. Mas, infelizmente, ela não aceita um valor de0
. Também não aceita valores não inteiros. Aqui está a melhor alternativa que posso oferecer sem recorrer atimeout
outro utilitário externo:Mesmo aqui, não é possível ter o
netcat
tempo de audição graciosamente. (A-w
opção de tempo limite é ignorada e-q
é irrelevante.) Algo assim pode ser útil em uma situação prática, de modo que anetcat
eliminação seja interrompida após 90 segundos:fonte
-q 0
funciona para mim.udp
tcp
fonte
Tropeçamos nisso quando pesquisamos no Google sobre praticamente o mesmo problema. O problema foi que o netcat foi morto pelo bash logo após todos os dados terem sido sugados, sem nenhuma chance de receber a resposta.
Minha solução para isso foi adicionar algum atraso após a canalização dos dados, assim:
Com um arquivo, isso pode se parecer com:
fonte
netcat
ainda não fecha quandosleep
termina. Eu esperaria que a primeira linha de comando retornasse ao prompt após 1 segundo, mas isso não acontece.-q 1
? ie(echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379
?-q
tudo funciona, até o exemplo da minha pergunta original. Mudei para uma versão mais recente do Ubuntu desde então, talvez isso cause a diferença.