[Dica] Transferindo arquivos com Netcat

Se você tiver acesso a dois computadores na mesma rede local, além dos meios já “clássicos” de transferência (como enviar e baixar da “nuvem”, Bluetooth, scp/sshfs, etc.), é possível utilizar o netcat (comando nc) para isso.

Não é necessário trocar chaves ou PINs, nem hardware especial, nem uma conexão “real” à internet; basta dois computadores ligados ao mesmo roteador.

Instalação

Em muitas distribuições, não há um único pacote chamado netcat. Costuma haver duas opções: o OpenBSD Netcat e o GNU Netcat. Por exemplo, no Artix:

# pacman -S netcat
:: Há 2 provedores disponíveis para netcat:
:: Repositório world
   1) gnu-netcat
:: Repositório galaxy
   2) openbsd-netcat

Na dúvida, consulte o repositório da distribuição.

Eu pessoalmente uso a do OpenBSD, mas ambos fornecem um comando nc que funciona para esse tutorial. Já fiz transferências até entre o Netcat do OpenBSD (no PC) e o Netcat do GNU (no Termux), e entre esses e o Netcat incluído no macOS.

Transferindo um arquivo só

1. Preparando o PC receptor

Para iniciar uma transferência de um arquivo só, vá no PC que vai receber e digite:

nc -l 7777 > saida.txt

Isso iniciará o netcat no modo escuta na porta 7777, e direcionará a saída padrão do mesmo (no caso, os dados recebidos) no arquivo saida.txt.

O 7777 é um exemplo apenas; você pode escolher qualquer número maior que 1024* para servir de ponto de escuta.
Lembre-se de especificar o > arquivo, caso contrário os arquivos vão direto para o terminal (potencialmente tendo caracteres inválidos.).

2. Descobrindo o IP local do PC receptor

Para enviar o arquivo, é necessário saber o IP do PC que recebe na rede local. Você pode fazer isso ip addr show, vendo as linhas com inet e pegando a primeira sem 127.0.0.1 nem ::1 (que só funcionam dentro do próprio PC):

$ ip addr show | grep inet
    inet 127.0.0.1/8  [...] # não funciona em outras partes da rede local
    inet6 ::1/128     [...] # não funciona em outras partes da rede local
    inet 10.0.0.22/24 [...] # Esse!
[...]

Veja a sequência de quatro número separados por ponto, descarte o que tem depois da barra e você tem o endereço do PC receptor na rede local (no exemplo, 10.0.0.22).

Em algumas interfaces gráficas (como o KDE), isso pode ser identificado no menu de redes (“Endereço IPv4”):

Imagem

https://askcaty.com/wp-content/uploads/2018/12/Finding-Local-IP-Address-on-KDE.png
(copiado de https://askcaty.com/how-to-find-ip-address-of-a-device-on-linux/)

3. Enviando o arquivo

Basta ir para o PC com o arquivo a ser enviado agora e usar o comando:

nc 10.0.0.22 7777 < /caminho/do/arquivo

Troque 7777 pelo número que você usou no comando do passo 1, 10.0.0.2 pelo endereço que você achou no passo 2 e /caminho/do/arquivo pelo caminho do arquivo.

A transferência está iniciada, e o netcat usará o arquivo depois do < como entrada padrão, enviando-o pela rede. Não há nenhuma indicação de progresso além do arquivo crescendo no PC receptor, no entanto.

Transferindo vários arquivos

O nc pode na verdade transferir qualquer tipo de dados via rede, usando a sua entrada e saída padrões. Você pode utilizá-lo para fazer que partes de uma pipeline (sequências de |) rodem em máquinas diferentes.

Podemos explorar isso para transmitir arquivos em grupo: criamos um arquivo tar em PC e o extraímos no outro, efetivamente transferindo vários arquivos.

No PC receptor, o comando seria:

# Extrair dados vindos da rede e listar os arquivos criados
nc -l 7777 | tar -xvf-

E no PC que envia:

# Criar um arquivo tar e despachar pela rede
tar -cf- foto1.jpg foto2.jpg | nc 10.0.0.22 7777

Isso simplesmente combina as capacidades de agrupar arquivos do tar com as capacidades de enviar dados pela rede do nc.

Indicações de progresso

Se estiver enviando um único arquivo grande, e uma indicação de progresso te dá um alívio, podemos explorar o dd para nos indicá-lo:

dd if=backup.iso status=progress | nc 10.0.0.22

Se quiser também no PC receptor:

nc -l 7777 | dd status=progress of=backup.iso

Note que, em ambos os exemplos, o netcat passa a apenas fazer a conexão e a transmissão, enquanto o dd se encarrega de salvar os conteúdos em um arquivo (e indicar o progresso).

Também não é obrigatório usar dd em ambos; o dd poderia ficar apenas no remetente, ou só no receptor, ou como já vimos, em nenhum dos dois.

Conclusão

Espero que isso sirva de introdução ao netcat e como essa ferramenta é versátil. Eu costumo transmitir chaves SSH assim, por exemplo.

Claro que isso é uma fração do seu poder e com um pouco de criatividade e conhecimentos de terminal dá para extrair muitos usos dele (e, especialmente, enriquecer programas de terminal com capacidades de rede onde isso nem era esperado).

É isso, espero que vos seja útil.


* As portas menores ou iguais a 1024 são reservados para serviços rodando como root, logo não podem ser utilizadas por usuários comuns.

9 curtidas