Como saber quando o NC termina de transferir um arquivo

11

Existe uma maneira de saber quando o netcat termina a transferência de um arquivo entre máquinas?

Comandos atuais:

Máquina 2: nc -lp 5555 > test.txt

Máquina # 1: nc MachineIP Port < test.txt

A transferência acontece, mas não há indicação visual de que tenha sido concluída.

Anthony Russell
fonte

Respostas:

19

Primeiro alguns antecedentes

Existem versões diferentes de nc, como você pode encontrar na página de manual nc (1) - Linux ou no manual de comandos gerais do nc (1) BSD, a conexão deve desligar imediatamente após a transferência. Há um exemplo dado nos dois sites vinculados:

Comece usando nc para escutar em uma porta específica, com a saída capturada em um arquivo:

$ nc -l 1234 > filename.out

Usando uma segunda máquina, conecte-se ao processo de escuta nc, alimentando o arquivo que será transferido:

$ nc host.example.com 1234 < filename.in

Após a transferência do arquivo, a conexão será fechada automaticamente.

O seu netcatcomputador não fecha a conexão após a transferência, portanto é diferente do (s) descrito (s) acima. Ele se comporta como o meu, o Netcat 1.10 no Debian Jessie. Esse comportamento está documentado em /usr/share/doc/netcat-traditional/README.gz(na minha máquina), o negrito é meu:

No uso mais simples, "porta do host nc" cria uma conexão TCP com a porta especificada no host de destino especificado. Sua entrada padrão é então enviada ao host e tudo o que retorna através da conexão é enviado à sua saída padrão. Isso continua indefinidamente, até que o lado da rede da conexão seja desligado. Observe que esse comportamento é diferente da maioria dos outros aplicativos que encerram tudo e saem após um final de arquivo na entrada padrão.

Aqui está o raciocínio por trás desse comportamento:

Você pode estar se perguntando "por que não usar apenas o telnet para conectar-se a portas arbitrárias?" Pergunta válida e aqui estão alguns motivos. O Telnet tem o problema "entrada padrão EOF", portanto, é necessário introduzir atrasos calculados nos scripts de direção para permitir que a saída da rede seja concluída. Esse é o principal motivo pelo qual o netcat permanece em execução até o lado da rede fechar.

A Wikipedia possui uma série de implementações diferentes . Não posso citar diferenças. Talvez alguém mais possa?


Agora, soluções

1

Você pode dizer ncpara sair após a leitura do arquivo. Esta opção é útil:

-q seconds   after EOF on stdin, wait the specified number  of  seconds
             and then quit. If seconds is negative, wait forever.

Se você usar este comando no final do envio:

nc -q 0 MachineIP Port < test.txt

ncserá fechado 0 segundos após a leitura do EOF, ou seja, logo após o término do arquivo. Ele sairá e o receptor também terminará nc.

Se você se pergunta o que acontece se os pacotes não forem transmitidos, aqui está um comentário de Juraj.

Quando todos os pacotes não aparecerem, o sistema detectará isso e os transmitirá novamente sem que o aplicativo perceba (ou, se não for possível, o aplicativo receberá um erro de tempo limite). Entrega confiável é o objetivo do protocolo TCP fornecido pelo kernel do SO, que ncusa. Você pode solicitar o protocolo UDP que não faz isso, usando, nc -umas esse não é o caso.

2

Há um exemplo original no mencionado README.gz, que é baseado no -wtempo limite e não requer a -qopção de estar presente em sua implementação.

O Netcat pode ser usado como um simples agente de transferência de dados, e realmente não importa qual extremidade é o ouvinte e qual extremidade é o cliente - a entrada de um lado chega do outro lado como saída. É útil iniciar o ouvinte no lado de recebimento sem tempo limite especificado e, em seguida, dar ao lado de envio um pequeno tempo limite. Dessa forma, o ouvinte fica ouvindo até você entrar em contato com ele e, depois que os dados param de fluir, o cliente atinge o tempo limite, é encerrado e leva o ouvinte com ele. A menos que a rede intermediária esteja cheia de problemas, isso deve ser totalmente confiável e você sempre pode aumentar o tempo limite. Um exemplo típico de algo "rsh" é frequentemente usado para: de um lado,

nc -l -p 1234 | uncompress -c | tar xvfp -

e depois do outro lado

tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234

transferirá o conteúdo de um diretório de uma máquina para outra, sem precisar se preocupar com arquivos .rhosts, contas de usuário ou configurações inetd em cada extremidade.


fonte
Parece que não consigo fazer isso funcionar. Quando eu faço -q, ele diz que o comando não existe. Vejo -w semelhante, mas isso não faz com que a conexão para sair
Anthony Russell
Qual a sua ncversão? Para verificar: nc -h, primeira linha.
ehh sim, é bem antigo. Estou em uma imagem antiga do linux. Vou atualizá-lo e tentar outra vez #
Anthony Russell
Eu atualizei minha resposta.
1
Quando todos os pacotes não aparecerem, o sistema operacional detectará isso e os transmitirá novamente sem que o aplicativo perceba (ou, se isso ainda falhar, o aplicativo receberá um erro de tempo limite). Entrega confiável é o objetivo do protocolo TCP fornecido pelo kernel do SO, usado pela nc. Você pode solicitar o protocolo UDP que não faz isso, usando nc -u, mas esse não é o caso.
Juraj