Como eu pude EOF 'cat' através de 'netcat' sem fechar a conexão?

3

Eu me deparei com um problema em que tenho um servidor ncat com o comando ncat -l [port] -k -c "cat > foo; cat > bar" . Quando me conecto a esse servidor por meio do netcat, ele permite que eu grave no arquivo foo e, depois disso, bar . O problema é que quando o cliente se conectando deseja parar de escrever foo enviando um ^D , ele fecha o cliente em vez de passar para bar , então bar nunca é gravado. Como posso ignorar isso? O que é uma alternativa para cat que me permite sair com um comando em vez de um EOF ?

    
por SpecialBomb 19.05.2016 / 01:33

1 resposta

1

Se o que você quer fazer é transferir 2 arquivos com apenas 1 conexão, você terá que usar um marcador para separar os arquivos no fluxo de dados, já que o fim de arquivo é uma leitura de comprimento 0 que o netcat use para fechar o soquete.

Control-D pode ser o que você pode digitar em um terminal para significar fim de arquivo, mas não gera um caractere, ele encerra a leitura com um comprimento de 0. Não há Control-D nos dados stream.

Para transferir 2 arquivos simplesmente, você pode usar um comando de empacotamento existente como tar . Use nc -k -l 4458 -v -c 'tar xf - >&2' como seu receptor e tar cf - foo bar como seu remetente. (Como os nomes dos arquivos vêm do remetente, você deve confiar no remetente).

Como alternativa, se seus arquivos forem simples, você poderá introduzir uma linha especial para separar os dois arquivos. Por exemplo, no remetente cat foo; echo bye; cat bar e no receptor algo como

nc -k -l 4458 -v -c 'awk -v file=foo '\''/^bye$/{ file="bar";next }{print >file}'\'

Este script GNU awk contém o primeiro nome de arquivo na variável file , então quando ele vê a linha "bye" ele muda para o segundo nome de arquivo.

    
por 19.05.2016 / 20:15

Tags