netcat não imprime resposta

12

Estou tentando enviar comandos para uma porta tcp usando netcate resposta de pipe
quando executo netcate digito meu comando, ele imprime a resposta corretamente, mas quando passo o comando de um pipe, ele envia o comando corretamente, mas não imprime a resposta

Então, isso funciona corretamente:

netcat  localhost 9009

enquanto isso apenas envia o comando, mas não imprime resposta:

echo 'my_command' | netcat  localhost 9009

porque?
Como faço netcatpara imprimir o texto da resposta?

RYN
fonte
isso provavelmente está acontecendo com você
Jeff Schaller
@JeffSchaller: não! infelizmente, usar esses comandos não ajuda! desta vez bloqueia para sempre!
RYN
Qual netcat você está usando? Infelizmente, há uma dúzia de variações diferentes da ferramenta netcat, e elas não se comportam da mesma forma. Além disso, o que há no lado remoto?
Patrick
@ Patrick: meu netcat é a OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)versão; e na extremidade remota está telegram-clina mesma máquina.
RYN
Acho que encontrei uma página de manual para esse netcat, mas não vejo sinalizadores que controlem o que suspeito estar acontecendo. Suspeito que uma vez que netcatreceba o EOF no STDIN, ele imediatamente desligue os dois lados do soquete, em vez de fechar pela metade e esperar o lado remoto fechar o seu final. Se socatfor uma opção, eu recomendo. Há apenas um socat, para que você não tenha problemas de portabilidade, com uma dúzia de sabores diferentes, ele se comporta de maneira muito mais saudável e é altamente configurável.
Patrick

Respostas:

8

Como o @Patrick disse, esse problema geralmente ocorre devido à netcatsaída antes que a resposta seja dada. Você corrige isso adicionando -q 2à linha de comando, ou seja, diga netcatpara travar cerca de 2 segundos após detectar o EOF na entrada padrão. Obviamente, você também pode esperar alguns outros segundos.

Ralph Rönnquist
fonte
Obrigado; -q 2funcionou, mas é confiável? está fazendo requisição na web. Não posso ter certeza de que o 2s é sempre suficiente! eu posso ?
RYN
1
Use um número maior para fazê-lo esperar mais tempo ou algum número negativo para fazê-lo esperar indefinidamente. Há também a -wopção de brincar. Isso é tudo na man ncpágina, é claro.
Ralph Rönnquist
5
ele dizinvalid option -- 'q'
phil294
Penso que uma boa pergunta de acompanhamento é: por que ncsair imediatamente em vez de esperar por uma resposta? Se a conexão ainda está aberta, deve haver uma opção para fazer ncesperar por ele para perto, não apenas para stdin ao fim
theferrit32
6

Usa isto:

cat <(echo command) - | nc host port

O problema é que ncfechará a conexão imediatamente após o fechamento do stdin, o que é muito rápido para uma my_commandsequência simples e, portanto, nunca tem a chance de receber uma resposta. (Se você canalizar um arquivo muito grande, verá que ele poderá obter uma resposta antes de enviar o arquivo).

Entre catcom -o segundo argumento: faz com que o catlisten on stdin busque mais conteúdo depois de enviar o conteúdo do primeiro argumento. O primeiro argumento é apenas obter o echocomando cat- também pode ser um arquivo com seus comandos à la cat < file - | ....

Como alternativa, faça o seguinte:

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

Isso envia #caracteres ilimitados na 2ª linha da entrada. Usar #obras para um bash como controle remoto que ignoraria isso como um comentário. Eu escolhi um pequeno tempo de espera de 10 milissegundos aqui, para que ele reaja mais rapidamente no final da conexão. YMMV.

A desvantagem disso pode ser isso catou o whileloop e nccontinuar correndo até você bater ^Cou ^Dno shell. Realmente depende da extremidade remota.

Adicionar um tempo limite usando -w 1(OSX netcat) ou -i 1(nmap's ncat) faz com que ela feche a conexão e ncapós 1 segundo, mas catcontinuará funcionando até você digitar algum caractere e as quebras de tubulação (eu acho).

No entanto, ele funciona se o lado remoto fechar automaticamente a conexão após receber e manipular o comando - isso também encerrará o nccliente e o processo sendo canalizado para ele.

Esta resposta é baseada nesta resposta a uma pergunta idêntica de superusuário .

Alexander Klimetschek
fonte
{ echo my_command; cat;}faria o mesmo e pode ser considerado mais fácil de entender.
G-Man Diz 'Reinstate Monica'
1

Diferentes versões openbsd-netcat são peculiares, precisando de diferentes combinações de -w <seconds>, -q <seconds>, -Ne argumentos diferentes, mesmo precisam dependendo do que está sendo executado na outra extremidade da conexão. O uso de opções de tempo limite com determinadas versões ou servidores causa atrasos e a não utilização pode resultar em um atraso extremamente longo (infinito?). E eu esperaria peculiaridades diferentes com o gnu netcat, mas não sei se elas são diferentes entre as versões.

Por exemplo, a versão 1.130_3 do archlinux leva muito tempo (para sempre?) Quando faço isso:

$ echo response | nc -l 9999 &
[1] 15190

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

Mas funciona com -N adicionado ao servidor ou ao cliente.

Pedro
fonte
1

Eu sei que isso é um pouco antigo, mas nenhuma outra resposta funcionou para mim e isso funcionou:

echo 'test' | netcat -N $server $port

Observe o -N:

desligue o soquete de rede após o EOF na entrada. Alguns servidores exigem que isso termine seu trabalho.

Trabalhou para mim no Windows e Linux.

Nota: esta é uma pasta de cópias da resposta que eu postei para uma pergunta duplicada .

Eu estou pensando que isso poderia ser útil. Os mods ficam à vontade para editar / excluir se isso for contra a política ou algo assim.

yannick1976
fonte