Meilleur moyen de transférer des fichiers sur un réseau local entre deux ordinateurs Linux

77

Je souhaite transférer des fichiers (un dossier de musique) entre deux ordinateurs Linux. Après avoir cherché le meilleur moyen de le faire, j'ai vu qu'il y avait beaucoup de façons de le faire. Je sais que cela a été demandé beaucoup , partout et tout le temps . Le principal problème avec cela est qu'il n'y a pas de consensus clair et récent sur la meilleure façon de faire cette tâche en 2011 pour les débutants sous Linux (même en fonction de certains paramètres).

Donc, dans l’esprit des sites Web Stack Exchange, je souhaite que cela ne soit pas lié à ma situation particulière, mais plutôt à un guide destiné à d’autres également sur la façon de transférer des fichiers entre deux ordinateurs Linux sur un réseau local. Je pense qu'un wiki serait utile pour beaucoup.

Voici ce que j'ai trouvé jusqu'à présent:

  • ssh
  • sshfs
  • scp
  • sftp
  • nfs
  • samba
  • donneur

Quel est le plus facile? Plus flexible? Le plus simple? Meilleure solution? Quels sont les avantages et les inconvénients de chacun? Y a-t-il d'autres (meilleures) options? Quels sont les paramètres pour choisir la meilleure méthode (la solution peut dépendre du nombre de fichiers, de la taille du fichier, de la facilité par rapport à la flexibilité, ...)?

jonallard
la source
2
Quelqu'un pourrait-il expliquer où rsync vient jouer dans tout cela?
Konerak
jonallard, veuillez ne pas ajouter les réponses à la question (cela n'a pas vraiment de sens de le faire, n'est-ce pas?) - si vous pensez que certaines réponses nécessitent des informations supplémentaires, vous pouvez suggérer des modifications ou créer votre propre réponse. qui résume tout!
slhck

Réponses:

65

Dans un environnement Linux, à la fois pour la sécurité et la convivialité, ssh est la meilleure solution. SSH, SSHFS, SCP et SFTP, tels que vous les répertoriez, ne sont que des services différents fondés sur le protocole SSH. SCP est très facile à utiliser, il fonctionne comme le CP, mais vous pouvez fournir des noms d’utilisateur et d’ordinateur dans le chemin. Donc, nous pourrions faire un CP comme cp ~/music/ ~/newmusic/, mais nous pourrions tout aussi facilement l' scp ~/music/ user@host:~/newmusicenvoyer à l'ordinateur nommé hôte. C'est ça - nous n'avons pas besoin de mettre en place quelque chose. Vous serez invité à saisir le mot de passe du compte sur l'autre ordinateur si vous n'avez pas de certificat ou une autre authentification configurée (scp partage ces paramètres avec ssh, bien sûr).

SFTP est un outil qui facilite l'exécution de nombreuses opérations sur un système de fichiers distant. Il fonctionne comme un serveur FTP, mais il s'exécute via SSH. Il est donc sécurisé et ne requiert qu'un serveur SSH. man sftpvous dira tout sur la façon de l'utiliser. Je n'utilise pas SFTP uniquement pour déplacer un dossier entre deux ordinateurs, c'est plus utile lorsque vous devez effectuer de nombreuses opérations, comme si vous réorganisiez des fichiers sur un autre ordinateur.

SSHFS étend simplement SFTP dans un système de fichiers: il vous permet de monter un hôte virtuel dans votre système de fichiers, de sorte que le contenu du réseau se déroule de manière totalement transparente. SSHFS est destiné aux configurations semi-permanentes, pas à un seul transfert de fichier. La mise en place nécessite un peu plus d’efforts, que vous pouvez lire sur le site Web du projet .

Si vous avez besoin de travailler dans un environnement de système d'exploitation mixte, Samba devient votre meilleur choix. Windows et OS X prennent en charge Samba de manière totalement automatique, tout comme Linux, bien que son utilisation soit parfois rude.

Jcrawfordor
la source
3
Exactement le genre de réponse que je souhaitais: complète, exhaustive, détaillée, pertinente.
jonallard
2
Une chose cependant, pour scpfonctionner, avons-nous besoin de mettre en place une sorte de serveur SSH, un auditeur ou de débloquer quelque chose de l'autre côté? Je reçois des erreurs "Connexion refusée".
jonallard
2
scp utilise ssh, donc cela fonctionnera si SSH fonctionne. Cela signifie, bien sûr, que vous devez avoir un serveur SSH en marche (par défaut dans chaque distribution Linux que je sache) et une connexion doit être possible (pare-feu, NAT, etc. doivent avoir les exceptions appropriées).
jcrawfordor
8
Apparemment, openssh-serverdoit être installé dans Ubuntu Natty.
jonallard
3
Notez que le sshcryptage est utilisé, ce qui entraînera une surcharge supplémentaire. Si les ordinateurs impliqués ont des processeurs assez lents, cela peut faire la différence. Dans ce cas netcatou similaire (voir la réponse de Caspar) pourrait être préférable. Bien sûr, uniquement si vous n'avez pas réellement besoin de cryptage (dans un réseau local protégé).
Sleske
59

Netcat + tar est ma solution préférée dans les cas où la sécurité importe peu :

Pour envoyer un répertoire, cd dans le répertoire dont vous voulez envoyer le contenu sur l'ordinateur et envoyez-le:

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

Sur l'ordinateur recevant le contenu, sélectionnez l'emplacement où vous souhaitez que le contenu apparaisse et procédez comme suit:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

Remplacez $REMOTE_HOSTpar ip / nom d'hôte de l'ordinateur effectuant l'envoi. Vous pouvez également utiliser un autre port au lieu de 45454.

Ce qui se passe en réalité, c’est que l’ordinateur «récepteur» se connecte à l’ordinateur émetteur sur le port 45454 et reçoit le contenu du répertoire tar'd et gzip'd, et le transmet directement à tar (et à gzip) pour l’extraire dans le répertoire en cours.

Exemple rapide (utilisation de localhost en tant qu'hôte distant)

Ordinateur 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

Ordinateur 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
la source
me rappelle un peu de sendnet et recnet des services ipx de Novel des vieux jours ...
sum1stolemyname
4
## netcat + bzip2 peut être un peu plus rapide avec des connexions lentes ## Envoi du serveur # cat file.txt | bzip2 -c | nc -l 1234 ## Serveur de réception # nc $ d'envoi_ip 1234 | bzip2 -cd>
file.txt
@Caspar: Que diriez-vous de modifier cette réponse pour suggérer une compression bzip2 ou lzma?
einpoklum - réintègre Monica
4
l' -qoption indique que vous utilisez openbsd-netcat , alors que gnu-netcat est également assez courant (par défaut dans Arch Linux ). Pourriez-vous étendre votre réponse pour inclure la syntaxe de gnu-netcat ?
Sébastien
1
L’actuel homme de réseau dit à propos de l’option -l: "C’est une erreur d’utiliser cette option en conjonction avec les options -p, -s ou -z", mais curieusement, cela ne génère pas une erreur lorsqu’on l’utilise. Je pense que l'utilisation de 'nc -l 45454' devrait aussi bien fonctionner.
Claudiu
19

Scp est recommandé pour les déplacements uniques.

Mais si vous trouvez que ce répertoire peut fonctionner et que vous devez le déplacer plusieurs fois pour que l'autre position soit mise à jour, vous pouvez utiliser rsync (avec ssh).

Comme rsync a beaucoup d'arguments, je le mets généralement dans un petit shell, donc je le comprends bien (à chaque fois). L'idée est d'envoyer uniquement les choses qui ont changé depuis la dernière fois.

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

Ceci déplacera un répertoire appelé "/ home / media / music /" de l'ordinateur local vers l'ordinateur appelé 192.168.0.33, à l'aide de l'utilisateur "nisse". Et supprimez tout élément sur la cible qui n’existe pas sur le PC local.

Johan
la source
1
+ pour rsync, ce qui semble un peu plus rapide et très agréable si vous devez synchroniser le répertoire ultérieurement
Wiesław Herr
Cela semble très prometteur (et facilement réutilisable) mais j'ai des répertoires et des fichiers avec des espaces et je reçois une erreur rsync: erreur de syntaxe ou d'utilisation (code 1) dans main.c (1348) [expéditeur = 3.1.1] - - Aucune suggestion?
Torben Gundtofte-Bruun
8

Je vous recommanderais d’essayer des alternatives plutôt que d’utiliser directement SSH pour déplacer des fichiers à l’intérieur de votre propre réseau local (LAN) étant donné que les frais généraux sont immenses. J'irais avec la solution de Caspar si celle-ci pour une raison quelconque ne fonctionnait pas pour vous:

A la source:

$ python3 -m http.server {PICK_YOUR_PORT}

Sur la destination:

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

Cela ne sera pas seulement plus léger que l’utilisation de SSH, mais bien plus rapide avec des vitesses allant de 45 à 65 Mo sur un convertisseur UTP CAT6 standard.
Si vous voulez vraiment tirer le meilleur parti de la connexion, essayez de remplacer wgetpar lftpet avec les commandes pget -n20et mirror -r.

cig0
la source
7

Le plus rapide est probablement netcat(comme décrit caspar).

J'aime la combinaison de tar& ssh, qui est sécurisée et toujours rapide:

Sur la source

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

En faisant cela en tant que root, il préserve les autorisations de fichiers. Ou utiliser des -pdeux côtés. Peut également -Sêtre envisagé si vous avez des fichiers fragmentés.

Il est possible de réduire la charge de chiffrement sshsi vous utilisez un arcfourchiffrement qui fonctionne avec openSSH:

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

Pour mettre à jour le chemin distant, rsyncc'est parfait:

rsync -av --sparse --delete -e "ssh -c arcfour" . root@targethost:/target/path
Tim Haegele
la source
1
FWIW, j’ai récemment fait un test de transfert entre deux ordinateurs portables modernes directement connectés, en utilisant rsync avec l’option arcfour et aucun argument spécifique -e. Je n'ai remarqué aucune différence de vitesse.
Randy Syring
4

Si cela doit absolument être fait sur le réseau local, je l'emploierais rsync, car il reprendra là où il s'est arrêté s'il est interrompu. Il propose également quelques autres astuces pour minimiser la quantité de données transférées, bien que je doute que beaucoup d’entre elles soient pertinentes pour la copie d’une bibliothèque musicale dans un lieu vierge. Si la sécurité vous préoccupe, définissez-la d' RSYNC_RSH=sshabord et les données seront tunnelées via ssh.

Si je le faisais, cependant, je n’utiliserais probablement pas le réseau local. Je copierais les fichiers sur un disque dur USB puis sur un disque dur. D'après mon expérience, cela peut facilement être plusieurs ordres de grandeur plus rapide que de passer par le réseau local, même si vous devez copier les fichiers deux fois - USB 2.0 est évalué à 480 Mbps, ce qui est plus rapide que tout ce qui est à court d'Ethernet gigabit et qu'il est moins sensible aux conditions. ce qui dégradera les performances d'un réseau local. Il est également totalement indépendant du système d'exploitation, à condition que vous utilisiez un système de fichiers que toutes les machines impliquées peuvent gérer. Je recommanderais VFAT / FAT32, car il s'agit d'un système assez universel.

Dave Sherohman
la source
1
Je suis également un fan du (soi-disant) sneakernet, mais il convient de souligner que, bien que l'USB 2 soit supposé pouvoir atteindre 480 Mbps, je ne l'ai jamais vu atteindre 30 Mo / s (environ 240 Mbps). ... peut-être n’ai-je que du matériel USB <-> SATA pas cher;) En outre, le format FAT32 est assez universel, mais il n’est pas recommandé de copier des éléments tels que des images DVD en raison de la contrainte de taille de 4 Go; Cela vaut la peine de préciser que les gens ne sont pas trop frustrés par le message d'erreur "out of space" de Windows (du moins).
Caspar
@Caspar: Bonnes mises en garde! Merci de les mentionner. J'oublie toujours la taille limite du fichier FAT32 ...
Dave Sherohman Le
2

Je suggérerais rsync car il copiera les fichiers progressivement. Vous pouvez le configurer pour copier uniquement les fichiers modifiés ou nouveaux une fois que vous avez effectué la mise à jour initiale. Vous pouvez utiliser ssh comme couche de transport si vous le souhaitez.

Sardathrion
la source
1

J'utilise Unison , qui est un synchroniseur de fichiers génial sur de nombreux protocoles différents. Vous pouvez le configurer pour utiliser scp, rcp, ftpou même localement sur le système de fichiers entre deux dossiers. Je l'utilise pour synchroniser ma bibliothèque musicale, car il peut transférer plusieurs fichiers à la fois sur le réseau et est vraiment paramétrable dans sa configuration. Je garde ma collection de musique sauvegardée et synchronisée sur 2 ou 3 ordinateurs. Il ne copie que les fichiers modifiés, en conservant un index aux deux extrémités du transfert afin de pouvoir savoir quand un client a modifié le fichier ou quand le fichier du serveur a été modifié.

Votre kilométrage peut varier, mais c’est certainement bien mieux que d’ scpintégrer votre collection de musique à chaque fois que vous ajoutez une nouvelle chanson :)

Naftuli Kay
la source
0

J'ai d'abord suivi le processus ssh pour la connexion sans mot de passe d'abord http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

Pour les scripts et les fichiers texte, les opérations suivantes me conviennent parfaitement

Pour transférer des données d'un hôte local à un hôte distant. cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

Pour transférer des données d'un hôte distant à un hôte local. ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

Cela me permet de transférer des fichiers sur des systèmes embarqués sur lesquels le client ssh ou scp n'est pas intégré.

Pas de SCP - seulement SSH.

enthousiastegeek
la source