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.