La mejor manera de transferir archivos a través de una LAN entre dos computadoras Linux

77

Quiero transferir archivos (una carpeta de música) entre dos computadoras Linux. Después de buscar la mejor manera de hacer esto, he visto que hay muchas formas de hacerlo. Sé que esto se ha pedido mucho , en todas partes y todo el tiempo . El principal problema con esto es que no hay un consenso claro y reciente sobre una mejor manera de hacer esta tarea en 2011 para los principiantes de Linux (incluso dependiendo de algunos parámetros).

Entonces, en el espíritu de los sitios web de Stack Exchange, quiero que esto no esté relacionado con mi situación particular, sino más bien una guía para otros también sobre cómo transferir archivos entre dos computadoras Linux a través de una red local. Creo que un wiki sería útil para muchos.

Esto es lo que encontré hasta ahora:

  • ssh
  • sshfs
  • scp
  • sftp
  • nfs
  • samba
  • dotante

¿Qué es lo más fácil? ¿El más flexible? Más simple? ¿Mejor solución? ¿Cuáles son los pros y los contras de cada uno? ¿Hay otras (mejores) opciones? ¿Cuáles son los parámetros para elegir el mejor método (la solución puede depender del número de archivos, tamaño de archivo, facilidad frente a flexibilidad, ...)?

jonallard
fuente
2
¿Alguien podría explicar dónde juega rsync en todo esto?
Konerak
Jonallard, por favor, no agregue las respuestas a la pregunta (realmente no tiene sentido hacer esto, ¿verdad?). Si cree que algunas respuestas necesitan información adicional, puede sugerir modificaciones o crear su propia respuesta. que resume todo!
slhck

Respuestas:

65

En un entorno Linux, tanto por seguridad como por facilidad de uso, ssh es la mejor opción. SSH, SSHFS, SCP y SFTP, como usted enumera, son solo servicios diferentes creados sobre el protocolo SSH. SCP es muy fácil de usar, funciona igual que CP pero puede proporcionar nombres de usuarios y máquinas en la ruta. Entonces, podríamos hacer un CP como cp ~/music/ ~/newmusic/, pero podríamos hacer lo mismo scp ~/music/ user@host:~/newmusicpara enviarlo a la computadora llamada host. Eso es todo, no necesitamos configurar nada. Se le pedirá la contraseña de la cuenta en la otra máquina si no tiene un certificado o alguna otra configuración de autenticación (scp comparte esa configuración con ssh, por supuesto).

SFTP es una herramienta que facilita la realización de muchas operaciones en un sistema de archivos remoto: funciona igual que FTP, pero se ejecuta a través de SSH, por lo que es seguro y solo requiere un servidor SSH. man sftple dirá todo sobre cómo usarlo. No uso SFTP solo para mover una carpeta entre dos máquinas, es más útil cuando tiene muchas operaciones que hacer, como si está reorganizando archivos en otra computadora.

SSHFS solo extiende SFTP a un sistema de archivos: le permite montar un host virtual en su sistema de archivos, por lo que las cosas de la red ocurren de manera totalmente transparente. SSHFS es para configuraciones semipermanentes, no solo una transferencia de archivos única. Se necesita un poco más de esfuerzo para configurarlo, sobre el cual puede leer en el sitio web del proyecto .

Si necesita trabajar en un entorno de sistema operativo mixto, Samba se convierte en su próxima mejor opción. Windows y OS X admiten Samba de forma completamente automática, y Linux también, aunque a veces es difícil de usar.

jcrawfordor
fuente
3
Exactamente el tipo de respuesta que deseaba: completa, exhaustiva, detallada, al grano.
jonallard
2
Sin embargo, una cosa, para scpque funcione, ¿necesitamos configurar algún tipo de servidor ssh, oyente o desbloquear algo en el otro lado? Recibo errores de "Conexión rechazada".
jonallard
2
scp usa ssh, por lo que funcionará si SSH funciona. Esto significa, por supuesto, que necesita tener un servidor SSH en ejecución (predeterminado en cada distribución de Linux que conozco) y una conexión debe ser posible (firewalls, NAT, etc. deben tener las excepciones apropiadas).
jcrawfordor
8
Aparentemente openssh-servertiene que estar instalado en Ubuntu Natty.
jonallard
3
Tenga en cuenta que sshutiliza cifrado, lo que provocará una sobrecarga adicional. Si las computadoras involucradas tienen CPU bastante lentas, esto podría marcar la diferencia. En ese caso netcato similar (ver la respuesta de Caspar) podría ser preferible. Por supuesto, solo si realmente no necesita cifrado (en una LAN protegida).
sleske
59

Mi favorito personal para casos donde la seguridad no importa es netcat + tar :

Para enviar un directorio, cd dentro del directorio cuyos contenidos desea enviar en la computadora haciendo el envío y hacer:

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

En la computadora que recibe el contenido, cd donde desea que aparezca el contenido y haga:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

Reemplace $REMOTE_HOSTcon ip / hostname de la computadora que realiza el envío. También puede usar un puerto diferente en lugar de 45454.

Lo que realmente sucede aquí es que la computadora 'receptora' se conecta a la computadora que envía en el puerto 45454 y recibe el contenido tar'd y gzip'd del directorio, y lo pasa directamente a tar (y gzip) para extraerlo El directorio actual.

Ejemplo rápido (usando localhost como host remoto)

Computadora 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

Computadora 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
fuente
un poco me recuerda a sendnet y recnet de los servicios IPX de novela de los viejos tiempos ...
sum1stolemyname
44
## netcat + bzip2 puede ser un poco más rápido en conexiones lentas ## Envío del servidor # cat file.txt | bzip2 -c | nc -l 1234 ## Servidor de recepción # nc $ shipping_ip 1234 | bzip2 -cd>
file.txt
@Caspar: ¿Qué tal editar esta respuesta para sugerir compresión bzip2 o lzma?
einpoklum - reinstalar a Monica el
44
la -qopción indica que está utilizando openbsd-netcat , mientras que gnu-netcat también es bastante común (predeterminado en Arch Linux ). ¿Podría extender su respuesta para incluir la sintaxis de gnu-netcat ?
Sebastian
1
El actual nc man dice acerca de la opción -l: "Es un error usar esta opción junto con las opciones -p, -s o -z", pero extrañamente no arroja un error al usarla. Creo que usar 'nc -l 45454' debería funcionar igual de bien.
Claudiu
19

Para movimientos únicos, se recomienda scp.

Pero si encuentra que este directorio puede funcionar y necesita moverlo muchas veces para mantener actualizada la otra posición, puede usar rsync (con ssh).

Dado que rsync tiene muchos argumentos, generalmente lo coloco en un pequeño shell para que lo haga bien (cada vez). La idea es enviar solo cosas que hayan cambiado desde la última vez que se ejecutó.

#!/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/

Esto moverá un directorio llamado "/ home / media / music /" de la computadora local a la PC llamada 192.168.0.33, usando el usuario "nisse". Y elimine cualquier cosa en el destino que no exista en la PC local.

Johan
fuente
1
+ para rsync, que parece un poco más rápido y es muy agradable si tienes que sincronizar el directorio más adelante
Wiesław Herr
Esto parece muy prometedor (y fácilmente reutilizable) pero tengo directorios y archivos con espacios y obtengo un error rsync: error de sintaxis o de uso (código 1) en main.c (1348) [remitente = 3.1.1] - - ¿alguna sugerencia?
Torben Gundtofte-Bruun
8

Te recomendaría que probaras alternativas en lugar de utilizar SSH para mover archivos dentro de tu propia LAN, ya que la sobrecarga es INMENSA. Iría con la solución de Caspar si esta, por alguna razón, no funciona para ti:

En la fuente:

$ python3 -m http.server {PICK_YOUR_PORT}

En destino:

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

Esto no solo será más liviano que usar SSH, sino mucho más rápido con velocidades que oscilan entre 45 y 65MiB en UTP CAT6 estándar.
Si realmente quiere exprimir el máximo rendimiento de la conexión intente reemplazar wgetcon lftpy usar pget -n20y mirror -rcomandos.

cig0
fuente
7

El más rápido es probablemente netcat(como se describe caspar).

Me gusta la combinación de tar& ssh, que es segura y aún rápida:

En la fuente

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

Al hacer eso como root, conserva los permisos de archivo. O usar -pen ambos lados. También -Spodría considerarse si tiene archivos dispersos.

Es posible reducir la sobrecarga de cifrado sshsi se usa arcfourcomo cifrado que funciona con openSSH:

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

Para actualizar la ruta remota, rsynces perfecto:

rsync -av --sparse --delete -e "ssh -c arcfour" . root@targethost:/target/path
Tim Haegele
fuente
1
FWIW, recientemente hice una prueba de transferencia entre dos computadoras portátiles modernas conectadas directamente usando rsync, ambas con la opción arcfour y sin argumento específico -e. No noté ninguna diferencia en las velocidades.
Randy Syring
4

Si es absolutamente necesario hacerlo a través de la LAN, lo usaría rsync, ya que continuará donde lo dejó si se interrumpe. También tiene algunos otros trucos para minimizar la cantidad de datos que se transfieren, aunque dudo que muchos / alguno de ellos sean relevantes para el caso de copiar una biblioteca de música en una ubicación virgen. Si la seguridad es una preocupación, solo configúrela RSYNC_RSH=sshprimero y los datos se tunelizarán a través de ssh.

Sin embargo, si realmente lo estuviera haciendo, probablemente no usaría la LAN en absoluto. Copiaría los archivos en, luego fuera de, un disco duro USB. En mi experiencia, esto puede ser fácilmente varios órdenes de magnitud más rápido que pasar por la LAN, a pesar de tener que copiar los archivos dos veces: USB 2.0 tiene una capacidad de 480Mbps, que es más rápido que cualquier cosa que no sea Gigabit Ethernet, además es menos sensible a las condiciones que degradará el rendimiento de una LAN. También es completamente independiente del sistema operativo, siempre que use un sistema de archivos que puedan manejar todas las máquinas involucradas; recomendaría VFAT / FAT32, ya que es bastante universal.

Dave Sherohman
fuente
1
Soy fanático de la (llamada) sneakernet también, pero vale la pena señalar que, si bien se supone que el USB 2 puede obtener 480 Mbps, solo lo he visto obtener 30 MB / s (aproximadamente 240 Mbps). tal vez solo tengo hardware USB <-> SATA barato;) Además, FAT32 es bastante universal, pero no se puede copiar cosas como imágenes de DVD debido a la restricción de tamaño de archivo de 4 gb; Vale la pena señalar para que la gente no se sienta demasiado frustrada por el mensaje de error "sin espacio" que Windows (al menos) da.
Caspar el
@Caspar: ¡Buenas advertencias! Gracias por mencionarlos; Siempre me olvido del límite de tamaño de archivo FAT32 ...
Dave Sherohman
2

Sugeriría rsync ya que copiará los archivos de forma incremental. Puede configurarlo para copiar archivos modificados o nuevos solo una vez que haya realizado la actualización inicial. Puede usar ssh como capa de transporte si lo desea.

Sardathrion
fuente
1

Uso Unison , que es un excelente sincronizador de archivos en muchos protocolos diferentes. Puede configurarlo para usar scp, rcp, ftpo incluso de forma local en el sistema de archivos entre dos carpetas. Lo uso para sincronizar mi biblioteca de música, ya que puede transferir múltiples archivos a la vez a través de la red y es realmente sintonizable en su configuración. Mantengo mi colección de música respaldada y sincronizada en 2-3 computadoras. Solo copiará los archivos modificados, y lo hace manteniendo un índice en ambos extremos de la transferencia para poder saber cuándo un cliente ha cambiado el archivo o cuándo ha cambiado el archivo del servidor.

Su kilometraje puede variar, pero sin duda es mucho mejor que scpincluir toda su colección de música cada vez que agrega una nueva canción :)

Naftuli Kay
fuente
0

Seguí el proceso ssh para iniciar sesión sin contraseña primero http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

Para secuencias de comandos y archivos de texto, lo siguiente funciona bien para mí

Para transferir datos del host local al host remoto. cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

Para transferir datos del host remoto al host local. ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

Esto funciona para mí para transferir archivos en sistemas embebidos que no tienen un cliente ssh o scp incorporado.

No scp - solo ssh.

Entusiasta
fuente