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 netcat
computador 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 nc
para 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
nc
será 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 nc
usa. Você pode solicitar o protocolo UDP que não faz isso, usando, nc -u
mas esse não é o caso.
2
Há um exemplo original no mencionado README.gz
, que é baseado no -w
tempo limite e não requer a -q
opçã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.