Melhor maneira de transferir arquivos através de uma LAN entre dois computadores Linux

77

Quero transferir arquivos (uma pasta de músicas) entre dois computadores Linux. Depois de procurar a melhor maneira de fazer isso, vi que existem várias maneiras de fazer isso. Eu sei que isso tem sido solicitado muito , em todos os lugares e o tempo todo . O principal problema disso é que não há um consenso claro e recente sobre a melhor maneira de executar essa tarefa em 2011 para iniciantes em Linux (mesmo dependendo de alguns parâmetros).

Portanto, no espírito dos sites da Stack Exchange, quero que isso não esteja relacionado à minha situação específica, mas mais um guia para outras pessoas, além de como transferir arquivos entre dois computadores Linux em uma rede local. Eu acho que um wiki seria útil para muitos.

Aqui está o que eu encontrei até agora:

  • ssh
  • sshfs
  • scp
  • sftp
  • nfs
  • samba
  • doador

Qual é o mais fácil? Mais flexível? Mais simples? Melhor solução? Quais são os prós e os contras de cada um? Existem outras (melhores) opções? Quais são os parâmetros na escolha do melhor método (a solução pode depender do número de arquivos, tamanho do arquivo, facilidade versus flexibilidade, ...)?

Jonallard
fonte
2
Alguém poderia explicar onde o rsync vem jogar nisso tudo?
Konerak
Jonallard, não adicione as respostas à pergunta (realmente não faz sentido fazer isso, não é?) - se você achar que algumas respostas precisam de informações adicionais, você pode sugerir edições ou criar sua própria resposta que resume tudo!
slhck

Respostas:

65

Em um ambiente Linux, para segurança e facilidade de uso, o ssh é o melhor caminho a percorrer. SSH, SSHFS, SCP e SFTP, como você lista, são apenas serviços diferentes criados sobre o protocolo SSH. O SCP é muito fácil de usar, funciona exatamente como o CP, mas você pode fornecer nomes de usuário e máquina no caminho. Portanto, podemos fazer um CP cp ~/music/ ~/newmusic/, mas poderíamos fazê scp ~/music/ user@host:~/newmusic-lo com a mesma facilidade para enviá-lo ao computador chamado host. É isso aí - não precisamos configurar nada. Você será solicitado a fornecer a senha da conta na outra máquina, se não tiver certificado ou alguma outra autenticação configurada (o scp compartilha essas configurações com o ssh, é claro).

O SFTP é uma ferramenta que facilita a execução de muitas operações em um sistema de arquivos remoto - funciona como FTP, mas é executado no SSH, portanto é seguro e requer apenas um servidor SSH. man sftplhe dirá tudo sobre como usá-lo. Eu não uso o SFTP apenas para mover uma pasta entre duas máquinas, é mais útil quando você tem muitas operações para fazer, como se estivesse reorganizando arquivos em outro computador.

O SSHFS apenas estende o SFTP para um sistema de arquivos: permite montar um host virtual no seu sistema de arquivos, para que o material da rede aconteça de maneira totalmente transparente. O SSHFS é para configurações semi-permanentes, não apenas para uma transferência única de arquivos. É preciso um pouco mais de esforço para ser configurado, sobre o qual você pode ler no site do projeto .

Se você precisar trabalhar em um ambiente com sistema operacional misto, o Samba se tornará sua próxima melhor aposta. O Windows e o OS X suportam o Samba completamente automaticamente, e o Linux também, embora às vezes seja difícil de usar.

jcrawfordor
fonte
3
Exatamente o tipo de resposta que eu estava procurando: completo, exaustivo, detalhado, direto ao ponto.
precisa saber é o seguinte
2
Uma coisa, porém, para scpfuncionar, precisamos configurar algum tipo de servidor ssh, ouvinte ou desbloquear algo do outro lado? Estou recebendo erros de "Conexão recusada".
jonallard
2
O scp usa ssh, portanto funcionará se o SSH funcionar. Isso significa, é claro, que você precisa ter um servidor SSH em execução (padrão em todas as distribuições Linux que eu conheço) e uma conexão deve ser possível (firewalls, NAT, etc. devem ter as exceções apropriadas).
Jcrawfordor
8
Aparentemente, openssh-servertem que ser instalado no Ubuntu Natty.
jonallard
3
Observe que sshusa criptografia, o que causará alguma sobrecarga adicional. Se os computadores envolvidos tiverem CPUs bastante lentas, isso pode fazer a diferença. Nesse caso, netcatou similar (consulte a resposta de Caspar) pode ser preferível. Obviamente, apenas se você não precisar de criptografia (em uma LAN protegida).
sleske
59

Meu favorito pessoal para os casos em que a segurança não importa é netcat + tar :

Para enviar um diretório, cd para dentro do diretório cujo conteúdo você deseja enviar no computador fazendo o envio e faça:

tar -cz . | nc -q 10 -l -p 45454

No computador que está recebendo o conteúdo, cd para onde você deseja que o conteúdo apareça e faça:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

Substitua $REMOTE_HOSTpor ip / hostname do computador que está enviando. Você também pode usar uma porta diferente em vez de 45454.

O que realmente está acontecendo aqui é que o computador 'receptor' está se conectando ao computador remetente na porta 45454 e recebendo o conteúdo tar'd e gzip'd do diretório e passando esse diretamente ao tar (e gzip) para extraí-lo no diretório o diretório atual.

Exemplo rápido (usando o host local como host remoto)

Computador 1

caspar@jumpy:~/nctest/a/mydir$ ls
file_a.txt  file_b.log
caspar@jumpy:~/nctest/a/mydir$ tar -cz . | nc -q 10 -l -p 45454

Computador 2

caspar@jumpy:~/nctest/b$ ls
caspar@jumpy:~/nctest/b$ nc -w 10 localhost 45454 | tar -xz
caspar@jumpy:~/nctest/b$ ls
file_a.txt  file_b.log
Caspar
fonte
meio que me lembra de sendnet e recnet de serviços IPX da novela de antigamente ...
sum1stolemyname
4
## netcat + bzip2 pode ser um pouco mais rápido em conexões lentas ## Enviando servidor # cat file.txt | bzip2 -c | nc -l 1234 ## Servidor de recebimento # nc $ send_ip 1234 | bzip2 -cd> file.txt
shantanuo
@ Caspar: Que tal editar esta resposta para sugerir a compressão bzip2 ou lzma?
einpoklum - reinstala Monica 23/11
4
a -qopção indica que você está usando o openbsd-netcat , enquanto o gnu-netcat também é bastante comum (padrão no Arch Linux ). Você poderia estender sua resposta para incluir a sintaxe do gnu-netcat ?
Sebastian
1
O atual nc man diz sobre a opção -l: "É um erro usar esta opção em conjunto com as opções -p, -s ou -z", mas estranhamente não gera um erro ao usá-la. Eu acho que usar 'nc -l 45454' também deve funcionar.
Claudiu
19

Para movimentos únicos, scp é recomendado.

Mas se você achar que esse diretório pode funcionar e precisar movê-lo várias vezes para manter a outra posição atualizada, poderá usar o rsync (com ssh).

Como o rsync tem muitos argumentos, eu costumo colocá-lo em um pequeno shell para que eu acerte (todas as vezes). A idéia é enviar apenas coisas que mudaram desde a última vez em que foi executado.

#!/bin/bash

user="nisse"
host="192.168.0.33"

echo "Sync: /home/media/music/"
rsync --archive --delete -v --progress -e "ssh -l $user " /home/media/music/ $host:/home/media/music/

Isso moverá um diretório chamado "/ home / media / music /" do computador local para o PC chamado 192.168.0.33, usando o usuário "nisse". E exclua qualquer coisa no alvo que não exista no PC local.

Johan
fonte
1
+ Para rsync, que parece um pouco mais rápido e é muito bom se você tem que sincronizar o diretório mais tarde
Wiesław Herr
Isso parece muito promissor (e facilmente reutilizável), mas tenho diretórios e arquivos com espaços e estou recebendo erro rsync: sintaxe ou erro de uso (código 1) em main.c (1348) [remetente = 3.1.1] - - alguma sugestão?
Torben Gundtofte-Bruun
8

Eu recomendaria que você tentasse alternativas, em vez de usar o SSH diretamente para mover arquivos dentro da sua própria LAN, pois a sobrecarga é IMENSA. Eu iria com a solução da Caspar se esta, por qualquer motivo, não funcionasse para você:

Na fonte:

$ python3 -m http.server {PICK_YOUR_PORT}

No destino:

$ wget -r {ip / hostname}:{port}/{File / Directory}

Isso não será apenas mais leve do que usar SSH, mas muito mais rápido com velocidades que variam de 45 a 65MiB no UTP CAT6 padrão.
Se você realmente deseja aproveitar ao máximo a conexão, tente substituir wgetpor lftpe usar os comandos pget -n20e mirror -r.

cig0
fonte
7

O mais rápido é provavelmente netcat(como caspar descreveu).

Gosto da combinação de tar& ssh, que é segura e ainda rápida:

Na fonte

tar -cf - . | ( ssh user@target && cd /target/path && tar -xf - )

Fazendo isso como root, ele preserva as permissões de arquivo. Ou use -pnos dois lados. Também -Spode ser considerado se você tiver arquivos esparsos.

É possível reduzir a sobrecarga de criptografia sshse você usar arcfourcomo criptografia que funciona com o openSSH:

tar -cpSf - . | ( ssh -c arcfour user@targethost && cd /target/path && tar -xpSf - )

Para atualizar o caminho remoto, rsyncé perfeito:

rsync -av --sparse --delete -e "ssh -c arcfour" . root@targethost:/target/path
Tim Haegele
fonte
1
FWIW, recentemente fiz um teste de transferência entre dois laptops modernos conectados diretamente usando o rsync, ambos com a opção arcfour e nenhum argumento -e específico. Não notei diferença nas velocidades.
Randy Syring
4

Se for absolutamente necessário fazer isso pela LAN, eu usaria rsync, pois ele continuará de onde parou se for interrompido. Ele também tem alguns outros truques para minimizar a quantidade de dados transferidos, embora eu duvide que muitos deles sejam relevantes para o caso de copiar uma biblioteca de música para um local virgem. Se a segurança é uma preocupação, basta definir RSYNC_RSH=sshprimeiro e os dados serão encapsulados no ssh.

Se eu estivesse realmente fazendo isso, provavelmente não usaria a LAN. Eu copiava os arquivos em um disco rígido USB e depois fora dele. Na minha experiência, isso pode ser facilmente várias ordens de magnitude mais rápido do que passar pela LAN, apesar de ter que copiar os arquivos duas vezes - o USB 2.0 é classificado para 480 Mbps, que é mais rápido do que qualquer coisa que não seja a Ethernet de gigabit, além de ser menos sensível às condições o que prejudicará o desempenho de uma LAN. Também é completamente independente do sistema operacional, desde que você use um sistema de arquivos com o qual todas as máquinas envolvidas possam lidar - eu recomendo o VFAT / FAT32, já que isso é universal.

Dave Sherohman
fonte
1
Também sou fã da (chamada) sneakernet, mas vale ressaltar que, embora o USB 2 deva ter 480Mbps, eu só vi 30MB / s (cerca de 240Mbps). (talvez apenas possua hardware USB <-> SATA barato;) Além disso, o FAT32 é praticamente universal, mas não permite copiar coisas como imagens de DVD devido à restrição de tamanho de arquivo de 4 GB; vale ressaltar que as pessoas não ficam muito frustradas com a mensagem de erro "fora do espaço" que o Windows (pelo menos) fornece.
Caspar
@Caspar: Boas advertências! Obrigado por mencioná-los; Eu sempre esquecer-se sobre o limite de tamanho de arquivos FAT32 ...
Dave Sherohman
2

Eu sugeriria o rsync, pois ele copiará os arquivos gradualmente. Você pode configurá-lo para copiar somente arquivos modificados ou novos apenas depois de fazer a atualização inicial. Você pode usar o ssh como uma camada de transporte, se desejar.

Sardathrion
fonte
1

Eu uso o Unison , que é um incrível sincronizador de arquivos em vários protocolos diferentes. Você pode configurá-lo para utilizar scp, rcp, ftpou mesmo localmente no sistema de arquivos entre duas pastas. Eu o uso para sincronizar minha biblioteca de músicas, pois ele pode transferir vários arquivos de uma só vez pela rede e é realmente ajustável em sua configuração. Eu mantenho minha coleção de músicas em backup e sincronizada em 2 a 3 computadores. Ele copiará apenas os arquivos alterados e o fará mantendo um índice nas duas extremidades da transferência, para poder saber quando um cliente alterou o arquivo ou quando o arquivo do servidor foi alterado.

Sua milhagem pode variar, mas certamente é muito melhor do que scptoda a sua coleção de músicas sempre que você adiciona uma nova música :)

Naftuli Kay
fonte
0

Eu segui o processo ssh para login sem senha primeiro http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

Para scripts e arquivos de texto, o seguinte funciona bem para mim

Para transferir dados do host local para o host remoto. cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

Para transferir dados do host remoto para o host local. ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

Isso funciona para mim transferir arquivos em sistemas embarcados que não têm o cliente ssh ou o scp embutido.

Não scp - apenas ssh.

entusiasta
fonte