Найкращий спосіб передачі файлів через локальну мережу між двома комп'ютерами Linux


77

Я хочу перенести файли (музичну папку) між двома комп’ютерами Linux. Шукаючи найкращого способу зробити це, я побачив, що існує маса способів зробити це. Я знаю , що це було запропоновано багато , всюди і весь час . Основна проблема з цим полягає в тому, що немає чіткого, недавнього консенсусу щодо одного найкращого способу виконання цього завдання в 2011 році для початківців Linux (навіть залежно від деяких параметрів).

Отже, в дусі веб-сайтів Stack Exchange, я хочу, щоб це не було пов’язане з моєю конкретною ситуацією, а більше керівництвом для інших, а також про те, як передавати файли між двома комп'ютерами Linux через локальну мережу. Я думаю, що вікі буде корисним для багатьох.

Ось що я знайшов поки що:

  • ssh
  • sshfs
  • scp
  • sftp
  • nfs
  • самба
  • даруючий

Що найпростіше? Найбільш гнучка? Найпростіший? Найкраще рішення? Які плюси і мінуси у кожного? Чи є інші (кращі) варіанти? Які параметри вибирають найкращий метод (рішення може залежати від кількості файлів, розміру файлів, легкості та гнучкості, ...)?


2
Хтось може пояснити, де rsync грає у всьому цьому?
Конерак

jonallard, будь ласка, не додайте відповіді на запитання (не дуже сенсу цього робити, чи не так?) - якщо ви вважаєте, що для деяких відповідей потрібна додаткова інформація, ви можете запропонувати зміни на них або створити власну відповідь. який узагальнює все!
slhck

Відповіді:


65

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

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

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

Якщо вам потрібно працювати в умовах змішаної ОС, Samba стане вашим наступним кращим ставкою. Windows і OS X підтримують Samba повністю автоматично, а Linux робить це добре, хоча іноді це грубе використання.


3
Саме такої відповіді я хотіла: повна, вичерпна, детальна, до суті.
jonallard

2
Одне, хоча для scpроботи нам потрібно налаштувати якийсь ssh-сервер, слухач або розблокувати щось з іншого боку? Я отримую помилки "Підключення відхилено".
jonallard

2
scp використовує ssh, тому він працюватиме, якщо SSH працює. Це, звичайно, означає, що вам потрібно мати SSH-сервер (за замовчуванням у кожному Linux-дистрибутиві, про який я знаю), і з'єднання повинне бути можливим (брандмауэры, NAT тощо повинні мати відповідні винятки).
jcrawfordor

8
Мабуть, openssh-serverмає бути встановлено в Ubuntu Natty.
jonallard

3
Зауважте, що sshвикористовується шифрування, що спричинить додаткові накладні витрати. Якщо на комп'ютерах є досить повільні процесори, це може змінити значення. У такому випадку netcatчи подібне (див. Відповідь Каспара) може бути кращим. Звичайно, лише якщо вам фактично не потрібно шифрування (в захищеній локальній мережі).
sleske

59

Мій особистий фаворит у випадках, коли безпека не має значення - netcat + tar :

Щоб надіслати каталог, введіть компакт-диск всередині каталогу, вміст якого потрібно надіслати на комп'ютер, який виконує надсилання:

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

На комп’ютері, що приймає вміст, cd до місця, де ви хочете, щоб вміст відображався і роби:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

Замініть $REMOTE_HOSTна ip / ім'я хоста комп'ютера, який здійснює надсилання. Ви також можете використовувати інший порт замість 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-сервісів роману старих часів ...
sum1stolemyname

4
## netcat + bzip2 може бути трохи швидшим при повільних з'єднаннях ## Відправлення сервера # cat file.txt | bzip2 -c | nc -l 1234 ## Приймаючий сервер # nc $ send_ip 1234 | bzip2 -cd> file.txt
shantanuo

@Caspar: Як щодо редагування цієї відповіді, щоб запропонувати стиснення bzip2 або lzma?
einpoklum

4
-qпараметр вказує на те, що ви використовуєте OpenBSD-Netcat , в той час як гну-Netcat також досить часто ( по замовчуванням в Arch Linux ). Чи можете ви розширити свою відповідь, щоб включити синтаксис gnu-netcat ?
Себастьян

1
Нинішня людина nc говорить про параметр -l: "Помилка використовувати цю опцію спільно з параметрами -p, -s або -z", але як не дивно, вона не видає помилку при використанні її. Я думаю, що використання 'nc -l 45454' має працювати так само добре.
Клавдіу,

19

На час переміщення рекомендується робити scp.

Але якщо ви виявите, що цей dir може працювати, і вам потрібно перемістити його багато разів, щоб інше положення було оновлене, тоді ви можете використовувати 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/

Це перемістить dir під назвою "/ home / media / music /" з локального комп'ютера на ПК під назвою 192.168.0.33, використовуючи користувач "nisse". І видаліть що-небудь із цілі, що не існує на локальному ПК.


1
+ для rsync, який здається, що швидше, і це дуже приємно, якщо вам доведеться синхронізувати каталог згодом
Wiesław Herr

Це здається дуже перспективним (і легко використовувати), але у мене є dirs та файли з пробілами, і я отримую помилку rsync: синтаксис або помилка використання (код 1) у main.c (1348) [sender = 3.1.1] - - будь-які пропозиції?
Torben Gundtofte-Bruun

8

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

У джерелі:

$ python3 -m http.server {PICK_YOUR_PORT}

Місце призначення:

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

Це не тільки легше, ніж використання SSH, але набагато швидше зі швидкістю 45 ~ 65MiB на стандартному CAT6 UTP.
Якщо ви дійсно хочете , щоб вичавити максимум з з'єднання спробуйте замінити wgetз lftpі використанням pget -n20і mirror -rкоманд.


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

1
FWIW, нещодавно я зробив тест на передачу між двома безпосередньо підключеними сучасними ноутбуками, використовуючи rsync як з опцією arcfour, так і без конкретного аргументу -e. Я не помітив різниці в швидкості.
Ренді Сирінг

4

Якщо це абсолютно необхідно зробити через локальну мережу, я б використав rsync, оскільки він підбере там, де він зупинився, якщо він перерветься. У ньому також є кілька інших хитрощів щодо мінімізації кількості переданих даних, хоча я сумніваюся, що багато / будь-який з них матиме відношення до випадку копіювання музичної бібліотеки до дев’ятого місця. Якщо безпека викликає занепокоєння, просто встановіть RSYNC_RSH=sshспочатку, і дані будуть тунельовані через ssh.

Якби я насправді це робив, я, мабуть, взагалі не використовував би локальну мережу. Я скопіював би файли на жорсткий диск USB, а потім його відключити. На мій досвід, це може бути на кілька порядків швидше, ніж перехід через локальну мережу, незважаючи на те, що потрібно копіювати файли двічі - USB 2.0 оцінюється на 480 Мбіт / с. що погіршить продуктивність локальної мережі. Це також повністю незалежно від ОС, за умови використання файлової системи, з якою можуть працювати усі задіяні машини - я б рекомендував VFAT / FAT32, оскільки це майже універсально.


1
Я також прихильник (так званої) кросівки, але варто зазначити, що в той час як USB 2 повинен мати можливість отримати 480 Мбіт / с, я лише бачив, щоб вона отримувала 30 Мб / с (близько 240 Мбіт / с). Можливо, у мене просто дешеве обладнання USB <-> SATA;) Крім того, FAT32 є майже універсальним, але не дозволяє копіювати такі речі, як зображення DVD, через обмеження розміру файлів 4 Гб; Варто зазначити, щоб люди не надто засмучувалися повідомленням про помилку "поза космосом", яке дає Windows (принаймні).
Каспар

@Caspar: Гарні застереження! Дякуємо, що згадали про них; Я завжди забуваю про обмеження розміру файлів 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.