Estou tentando enviar comandos para uma porta tcp usando netcat
e resposta de pipe
quando executo netcat
e 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 netcat
para imprimir o texto da resposta?
OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
versão; e na extremidade remota estátelegram-cli
na mesma máquina.netcat
receba 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. Sesocat
for uma opção, eu recomendo. Há apenas umsocat
, 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.Respostas:
Como o @Patrick disse, esse problema geralmente ocorre devido à
netcat
saída antes que a resposta seja dada. Você corrige isso adicionando-q 2
à linha de comando, ou seja, diganetcat
para travar cerca de 2 segundos após detectar o EOF na entrada padrão. Obviamente, você também pode esperar alguns outros segundos.fonte
-q 2
funcionou, mas é confiável? está fazendo requisição na web. Não posso ter certeza de que o 2s é sempre suficiente! eu posso ?-w
opção de brincar. Isso é tudo naman nc
página, é claro.invalid option -- 'q'
nc
sair imediatamente em vez de esperar por uma resposta? Se a conexão ainda está aberta, deve haver uma opção para fazernc
esperar por ele para perto, não apenas para stdin ao fimUsa isto:
O problema é que
nc
fechará a conexão imediatamente após o fechamento do stdin, o que é muito rápido para umamy_command
sequê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
cat
com-
o segundo argumento: faz com que ocat
listen on stdin busque mais conteúdo depois de enviar o conteúdo do primeiro argumento. O primeiro argumento é apenas obter oecho
comandocat
- também pode ser um arquivo com seus comandos à lacat < file - | ...
.Como alternativa, faça o seguinte:
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
cat
ou owhile
loop enc
continuar correndo até você bater^C
ou^D
no 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 enc
após 1 segundo, mascat
continuará 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
nc
cliente e o processo sendo canalizado para ele.Esta resposta é baseada nesta resposta a uma pergunta idêntica de superusuário .
fonte
{ echo my_command; cat;}
faria o mesmo e pode ser considerado mais fácil de entender.Diferentes versões openbsd-netcat são peculiares, precisando de diferentes combinações de
-w <seconds>
,-q <seconds>
,-N
e 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:
Mas funciona com -N adicionado ao servidor ou ao cliente.
fonte
Eu sei que isso é um pouco antigo, mas nenhuma outra resposta funcionou para mim e isso funcionou:
Observe o
-N
: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.
fonte