74

Я хочу передавать файлы (музыкальную папку) между двумя компьютерами Linux. После поиска лучшего способа сделать это, я увидел, что есть много способов сделать это. Я знаю, что об этом спрашивали много, везде и всегда. Основная проблема заключается в том, что в последнее время нет четкого консенсуса по поводу одного из лучших способов сделать эту задачу в 2011 году для начинающих пользователей Linux (даже в зависимости от некоторых параметров).

Поэтому, в духе сайтов Stack Exchange, я хочу, чтобы это было связано не с моей конкретной ситуацией, а скорее с руководством для других, а также о том, как передавать файлы между двумя компьютерами Linux по локальной сети. Я думаю, что вики была бы полезна для многих.

Вот что я нашел до сих пор:

  • SSH
  • SSHFS
  • УПП
  • SFTP
  • NFS
  • самба
  • податель

Что самое простое? Самый гибкий? Простейшее? Лучшее решение? Каковы плюсы и минусы каждого? Есть ли другие (лучшие) варианты? Каковы параметры при выборе лучшего метода (решение может зависеть от количества файлов, размера файла, простоты и гибкости, ...)?

9 ответов9

64

В среде Linux, как для безопасности, так и для простоты использования, лучше использовать ssh. SSH, SSHFS, SCP и SFTP, как вы перечислите, - это просто разные сервисы, построенные поверх протокола SSH. SCP очень прост в использовании, он работает так же, как CP, но вы можете указать имена пользователей и компьютеров в пути. Таким образом, мы могли бы сделать CP как cp ~/music/ ~/newmusic/ , но мы могли бы так же легко сделать scp ~/music/ user@host:~/newmusic для отправки его на компьютер с именем host. Вот и все - нам не нужно ничего настраивать. Вам будет предложено ввести пароль учетной записи на другом компьютере, если у вас нет сертификата или какой-либо другой настройки аутентификации (scp, разумеется, делится этими настройками с ssh).

SFTP - это инструмент, который позволяет легко выполнять множество операций в удаленной файловой системе - он работает так же, как FTP, но работает через SSH, поэтому он защищен и требует только SSH-сервера. man sftp расскажет вам все о том, как его использовать. Я не использую SFTP просто для перемещения папки между двумя компьютерами, это более полезно, когда у вас много операций, например, когда вы переставляете файлы на другом компьютере.

SSHFS просто расширяет SFTP до файловой системы: он позволяет вам подключить виртуальный хост к вашей файловой системе, поэтому работа с сетью происходит абсолютно прозрачно. SSHFS предназначена для полупостоянных настроек, а не просто для однократной передачи файлов. Для настройки требуется больше усилий, о которых вы можете прочитать на сайте проекта.

Если вам нужно работать в среде со смешанными ОС, Samba станет вашим лучшим выбором. Windows и OS X поддерживают Samba полностью автоматически, а Linux - тоже, хотя иногда это сложно использовать.

56

Мой личный фаворит для случаев, когда безопасность не имеет значения, является netcat + tar:

Чтобы отправить каталог, перейдите в каталог, содержимое которого вы хотите отправить на компьютер, выполняющий отправку, и выполните:

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

На компьютере, получающем содержимое, перейдите туда, где вы хотите, чтобы содержимое отображалось, и выполните:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

Замените $REMOTE_HOST на ip / hostname компьютера, выполняющего отправку. Вы также можете использовать другой порт вместо 45454 .

На самом деле происходит то, что «принимающий» компьютер подключается к передающему компьютеру через порт 45454 и получает содержимое каталога tar'd и gzip'd и передает его непосредственно в tar (и gzip) для его извлечения в текущий каталог.

Быстрый пример (использование localhost в качестве удаленного хоста)

Компьютер 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

Компьютер 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
19

Для однократных ходов рекомендуется scp.

Но если вы обнаружите, что этот каталог может работать, и вам нужно много раз перемещать его, чтобы обновлять другую позицию, вы можете использовать rsync (с ssh).

Поскольку у rsync много аргументов, я обычно помещаю его в небольшую оболочку, чтобы я понял это правильно (каждый раз). Идея состоит в том, чтобы отправлять только то, что изменилось с момента последнего запуска.

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

Это переместит каталог с именем «/home/media/music/» с локального компьютера на компьютер с именем 192.168.0.33, используя пользователя "nisse". И удалите что-нибудь на цели, которая не существует на локальном компьютере.

7

Самым быстрым, вероятно, является netcat (как описано с caspar).

Мне нравится сочетание tar & ssh , которое безопасно и все еще быстро:

По источнику

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

Делая это как root, он сохраняет права доступа к файлам. Или используйте -p с обеих сторон. Также -S может быть рассмотрен, если у вас есть разреженные файлы.

Можно уменьшить накладные расходы на шифрование ssh если вы используете arcfour качестве шифра, который работает с openSSH:

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

rsync идеально подходит для обновления удаленного пути:

rsync -av --sparse --delete -e "ssh -c arcfour" . root@targethost:/target/path
6

Я бы порекомендовал вам попробовать альтернативы, вместо того, чтобы идти прямо с SSH для перемещения файлов в вашей локальной сети, поскольку накладные расходы - IMMENSE. Я бы пошел с решением Каспара, если это по какой-то причине не будет работать для вас:

У источника:

$ python3 -m http.server {PICK_YOUR_PORT}

По назначению:

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

Это будет не только легче, чем при использовании SSH, но и намного быстрее со скоростями в диапазоне 45 ~ 65 МБ на стандартной CAT6 UTP.
Если вы действительно хотите выжать максимум из соединения, попробуйте заменить wget на lftp и использовать команды pget -n20 и mirror -r .

3

Если это абсолютно необходимо сделать через локальную сеть, я бы использовал rsync , так как он обнаружит, где остановился, если его прервут. В нем также есть несколько других приемов для минимизации объема передаваемых данных, хотя я сомневаюсь, что многие / любые из них будут иметь отношение к случаю копирования музыкальной библиотеки в нетронутую папку. Если вас беспокоит безопасность, сначала установите RSYNC_RSH=ssh и данные будут переданы по ssh.

Однако, если бы я на самом деле делал это, я бы вообще не использовал LAN. Я копировал файлы на жесткий диск USB, а затем выключал его. По моему опыту, это может быть на несколько порядков быстрее, чем при работе по локальной сети, несмотря на необходимость дважды копировать файлы - USB 2.0 рассчитан на 480 Мбит / с, что быстрее, чем что-либо, кроме гигабитного Ethernet, плюс он менее чувствителен к условиям что ухудшит производительность локальной сети. Он также полностью независим от ОС, при условии, что вы используете файловую систему, которую могут обрабатывать все задействованные машины, - я бы порекомендовал VFAT / FAT32, поскольку это в значительной степени универсально.

2

Я бы предложил rsync, поскольку он будет копировать файлы постепенно. Вы можете настроить его на копирование только измененных или новых файлов только после первоначального обновления. Вы можете использовать ssh в качестве транспортного уровня, если хотите.

1

Я использую Unison, который является отличным синхронизатором файлов по многим различным протоколам. Вы можете настроить его для использования scp , rcp , ftp или даже локально в файловой системе между двумя папками. Я использую его для синхронизации своей музыкальной библиотеки, поскольку она может передавать несколько файлов одновременно по сети и действительно настраивается в своей конфигурации. Я храню свою музыкальную коллекцию в резервном копировании и синхронизирую более 2-3 компьютеров. Он будет копировать только измененные файлы и делает это, сохраняя индекс на обоих концах передачи, чтобы иметь возможность определить, когда клиент изменил файл или когда файл сервера изменился.

Ваш пробег может варьироваться, но это, безусловно, намного лучше, чем scp всю свою музыкальную коллекцию каждый раз, когда вы добавляете новую песню :)

0

Сначала я следовал процессу ssh для входа без пароля http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

Для скриптов и текстовых файлов у меня просто отлично работает следующее

Для передачи данных с локального хоста на удаленный хост. cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

Для передачи данных с удаленного хоста на локальный хост. ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

Это работает для меня, чтобы передавать файлы во встроенных системах, в которых нет встроенного ssh-клиента или scp.

Нет scp - только ssh.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .