Como eu poderia fazer EOF `cat` através de `netcat` sem fechar a conexão?

Como eu poderia fazer EOF `cat` através de `netcat` sem fechar a conexão?

Encontrei um problema em que tenho um servidor ncat com o comando ncat -l [port] -k -c "cat > foo; cat > bar". Quando me conecto a este servidor através do netcat, ele me permite gravar no arquivo fooe, depois disso, bar. O problema é que quando o cliente que está se conectando deseja parar de escrever fooenviando um ^D, ele fecha o cliente em vez de passar a escrever para bar, portanto barnunca é gravado. Como posso contornar isso? Qual é a alternativa catque me permite sair com um comando em vez de um EOF?

Responder1

Se o que você deseja fazer é transferir 2 arquivos com apenas 1 conexão, você terá que usar de alguma forma um marcador para separar os arquivos no fluxo de dados, pois o fim do arquivo é uma leitura de comprimento 0 que o netcat usará para fechar a tomada.

Control-Dpode ser o que você pode digitar em um terminal para indicar o fim do arquivo, mas não gera um caractere, termina a leitura com comprimento 0. Não há nenhum Control-Dno fluxo de dados.

Para transferir 2 arquivos de forma simples, 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 barcomo seu remetente. (Como os nomes dos arquivos vêm do remetente, você deve confiar no remetente).

Alternativamente, se seus arquivos forem de texto simples, você poderá introduzir uma linha especial para separar os 2 arquivos. Por exemplo, no remetente cat foo; echo bye; cat bare no destinatário, 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 filee, quando vê a linha "tchau", ele muda para o segundo nome de arquivo.

informação relacionada