Лучший способ передачи файлов по локальной сети между двумя компьютерами Linux

77

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

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

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

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

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

jonallard
источник
2
Кто-нибудь может объяснить, где Rsync играет во всем этом?
Конерак
jonallard, пожалуйста, не добавляйте ответы на вопрос (на самом деле не имеет смысла делать это, не так ли?) - если вы чувствуете, что некоторые ответы нуждаются в дополнительной информации, вы можете предложить изменить их или создать свой собственный ответ который суммирует все!
Slhck

Ответы:

65

В среде 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, хотя иногда это сложно использовать.

jcrawfordor
источник
3
Именно такой ответ я хотел получить: полный, исчерпывающий, подробный, по сути.
Джоналлард
2
Однако для scpработы нам нужно настроить какой-нибудь ssh-сервер, прослушиватель или разблокировать что-то на другой стороне? Я получаю сообщение об ошибке "Отказано в соединении".
Джоналлард
2
scp использует ssh, поэтому он будет работать, если SSH работает. Это, конечно, означает, что вам нужно иметь работающий SSH-сервер (по умолчанию в каждом известном мне дистрибутиве linux), и соединение должно быть возможным (брандмауэры, NAT и т. Д. Должны иметь соответствующие исключения).
Джроуфордор
8
Видимо openssh-serverдолжен быть установлен в Ubuntu Natty.
Джоналлард
3
Обратите внимание, что sshиспользуется шифрование, которое вызовет некоторые дополнительные издержки. Если задействованные компьютеры имеют довольно медленные процессоры, это может иметь значение. В этом случае netcatили подобное (см. Ответ Каспара) может быть предпочтительнее. Конечно, только если вам не нужно шифрование (в защищенной локальной сети).
Слёске
59

Мой личный фаворит для случаев, когда безопасность не имеет значения, 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
Каспар
источник
вроде как напоминает мне о sendnet и recnet от ipx сервисов Novel о
былых
4
## netcat + bzip2 может быть немного быстрее при медленных соединениях ## Отправляющий сервер # cat file.txt | bzip2 -c | nc -l 1234 ## Приемный сервер # nc $ sent_ip 1234 | bzip2 -cd> file.txt
shantanuo
@Caspar: Как насчет редактирования этого ответа, чтобы предложить сжатие bzip2 или lzma?
einpoklum - восстановить Монику
4
-qпараметр указывает на то, что вы используете OpenBSD-Netcat , в то время как гну-Netcat также довольно часто ( по умолчанию в Arch Linux ). Не могли бы вы расширить свой ответ, включив в него синтаксис gnu-netcat ?
Себастьян
1
Текущий nc man говорит об опции -l: «Использование этой опции в сочетании с опциями -p, -s или -z является ошибкой», но странно, что при ее использовании ошибка не выдается. Я думаю, что использование 'nc -l 45454' должно работать так же хорошо.
Клавдиу
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». И удалите все, что не существует на локальном компьютере.

Johan
источник
1
+ для rsync, который кажется немного быстрее и очень полезен, если вам придется синхронизировать каталог позже
Wiesław Herr
Это представляется весьма перспективное (и легко многоразовый) , но у меня есть каталоги и файлы с пробелами , и я получаю сообщение об ошибке Rsync: синтаксис или ошибке использования (код 1) в main.c (1348) [Отправитель = 3.1.1] - - какие-либо предложения?
Торбен Гундтофте-Брюн
8

Я бы порекомендовал вам попробовать альтернативы, вместо того, чтобы идти прямо с 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команд.

cig0
источник
7

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

Мне нравится сочетание 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
Тим Хэгеле
источник
1
FWIW, я недавно провел тест переноса между двумя напрямую подключенными современными ноутбуками, используя rsync и с параметром arcfour, и без конкретного аргумента -e. Я не заметил разницы в скорости.
Рэнди
4

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

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

Дейв Шерохман
источник
1
Я также фанат (так называемого) sneakernet, но стоит отметить, что, хотя USB 2 должен иметь скорость 480 Мбит / с, я видел только 30 МБ / с (около 240 Мбит / с). . возможно, у меня просто дешевое USB <-> оборудование SATA;) Кроме того, FAT32 довольно универсален, но не позволяет копировать такие вещи, как образы DVD, из-за ограничения размера файла 4 ГБ; Стоит отметить, чтобы люди не слишком расстраивались из-за сообщения об ошибке «Недостаточно места», которое выдает Windows (по крайней мере).
Каспар
@ Каспар: Хорошие предостережения! Спасибо за упоминание их; Я всегда забываю об ограничении размера файла FAT32 ...
Дейв Шерохман
2

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

Sardathrion
источник
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.

enthusiasticgeek
источник