Comportamento Netcat / socat com tubulação e UDP?

16

Eu acho que isso é quase linux - o Netcat para de ouvir o tráfego UDP - Superusuário , mas achei melhor perguntar de qualquer maneira

No que diz respeito às versões do netcat , estou usando o Ubuntu 11.04 e o padrão netcat, que acho que é o seguinte openbsd:

$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
      [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
      [-x proxy_address[:port]] [hostname] [port[s]]

 

Isso é o que acho estranho: o primeiro caso funciona como esperado - abro um servidor UDP em um terminal:

$ sudo nc -ul 5000

... e em outro terminal inicio uma nova conexão de cliente UDP - e digito hellotrês vezes, pressionando ENTER após cada uma:

$ nc -u 127.0.0.1 5000
hello
hello
hello
^C

... e voltando ao terminal do servidor, ele foi impresso hellotrês vezes, conforme o esperado:

$ sudo nc -ul 5000 
hello
hello
hello
^C

 

Até aí tudo bem, tudo funciona como esperado. No entanto, digamos que eu tente agora o mesmo canalizando a entrada para o cliente; para estabelecer primeiro um servidor UDP em um terminal:

$ sudo nc -ul 5000

... e em outro, canalize alguns dados nccomo cliente UDP:

$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C

... após o comando do cliente, o shell congela como se estivesse esperando pela entrada - então digito helloe ENTER mais duas vezes; mas o servidor registrou apenas o primeiro hello(que foi canalizado via echo). Além disso, mesmo se você pressionar Ctrl-C, e tentar repetir o cliente echo hello | nc -u 127.0.0.1 5000comando, o servidor irá ainda permanecem em ter relatado apenas o primeiro hello:

$ sudo nc -ul 57130 
hello
^C

... e somente depois de parar o servidor com Ctrl-C e reiniciá-lo novamente, é possível repetir o echo hello | nc -u 127.0.0.1 5000comando do cliente e observá-lo funcionando.

 

É assim que ncdeveria estar se comportando? Eu esperava que pelo menos as chamadas repetidas echo hello | nc -u 127.0.0.1 5000fossem registradas - sem ter que reiniciar o servidor? Ou talvez haja uma opção de linha de comando especial para esse tipo de comportamento?

EDIT: Encontrei esta bela apresentação em PDF: socat - Manipulando todos os tipos de soquetes , que contém as seguintes notas netcatvs socat:

netcat - Limitações
● Apenas um tiro (termina após o fechamento do soquete)
...
Exemplos 1: Substituição do netcat
...
● Cliente UDP com porta de origem:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Servidor TCP:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...

... no entanto, estou obtendo o mesmo comportamento acima, se eu substituir o comando do servidor por " socat - udp4-listen:5000,reuseaddr" - e a linha do cliente por " socat - udp:127.0.0.1:5000" ... Com a entrada canalizada " echo hello | socat - udp:127.0.0.1:5000", a única diferença é que aqui o comando existe pelo menos depois que a palavra hellofoi enviada - no entanto, novamente, execuções consecutivas desse comando não causarão nenhuma recepção no servidor, até que o servidor seja reiniciado.

sdaau
fonte

Respostas:

23

Ok, acho que pelo menos consegui algo com socat- ou seja, a opção forkprecisa ser anexada à linha do servidor:

$ socat - udp4-listen:5000,reuseaddr,fork

... e então, em outro terminal, podemos chamar a echotubulação na socatlinha do cliente várias vezes na linha de comando, pois ela sairá imediatamente ( bem, depois de meio segundo :) ):

$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000

... e voltando ao primeiro terminal, podemos ver que o servidor mostrou com êxito todos os três hellos:

$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C

 

Observe que, mesmo com um servidor forked socat, a linha echo "hello" | nc -u 127.0.0.1 5000ainda 'bloqueará' como se estivesse aguardando a entrada do usuário; no entanto, agora após Ctrl-C e reexecutar o comando, ou seja,

$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C

... o servidor fork-ed socatmostrará três hellos sem a necessidade de ser reiniciado.

 

Aparentemente, este openBSD netcatnão tem uma forkopção - mas não tenho certeza se tem uma que corresponda a ela ..

De qualquer forma, espero que isso ajude alguém,
Saúde!

sdaau
fonte
4

Seu netcat está apenas lendo a saída do stdout do eco quando você usa pipe, ele não está mais "conectado" ao teclado. Para obter a resposta esperada, você pode adicionar seus três "alô" a um arquivo e executar

cat [myfile] | nc -u 127.0.0.1 5000
OldWolf
fonte
Olá @ OldWolf - muito obrigado pela sua resposta! Tentei sua sugestão (também de uma maneira um pouco mais complicada "," cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000), no entanto, enquanto vejo três hellos, o que me intriga ainda está presente: esse comando também meio que "trava", como se estivesse esperando a entrada digitada de usuário, e depois de Ctrl-C e executá-lo novamente, o servidor não verá nenhum dado até que seja reiniciado !? É isso que eu gostaria de saber melhor - saúde!
Sdaau # 3/11
2
O nc está aguardando um EOF que, neste caso, não é recebido até você enviar o sinal de saída para o programa.
OldWolf
Ahh, entendo - muito obrigado por essa explicação, @ OldWolf! Aparentemente, socatpode contornar isso com a forkopção ... Obrigado novamente, felicidades!
sdaau 3/09/11
3

Se você fizer um rastreamento da escuta nc, ele mostrará que o netcat está aguardando a conexão e, uma vez obtida, se conectará a esse host e porta, ignorando todos os outros. Você precisa adicionar '-k' para continuar e '-w 0' para atingir o tempo limite de cada conexão após 0 segundos. Socat é uma escolha melhor, eu acho.

pdragon
fonte