Cara terbaik untuk mentransfer file melalui LAN antara dua komputer Linux

77

Saya ingin mentransfer file (folder musik) antara dua komputer Linux. Setelah mencari cara terbaik untuk melakukan ini, saya telah melihat bahwa ada banyak cara untuk melakukan ini. Saya tahu ini telah diminta banyak , di mana-mana dan setiap saat . Masalah utama dengan ini adalah tidak ada konsensus yang jelas dan terkini tentang satu cara terbaik untuk melakukan tugas ini pada tahun 2011 untuk pemula Linux (bahkan tergantung pada beberapa parameter).

Jadi dalam semangat situs web Stack Exchange, saya ingin ini tidak terkait dengan situasi khusus saya, tetapi lebih merupakan panduan bagi orang lain juga tentang cara mentransfer file antara dua komputer Linux melalui jaringan lokal. Saya pikir wiki akan bermanfaat bagi banyak orang.

Inilah yang saya temukan sejauh ini:

  • ssh
  • sshfs
  • scp
  • sftp
  • nfs
  • samba
  • pemberi

Apa yang paling mudah? Paling fleksibel? Paling sederhana? Solusi terbaik? Apa pro dan kontra dari masing-masing? Apakah ada opsi lain (lebih baik)? Apa parameter dalam memilih metode terbaik (solusi mungkin tergantung pada jumlah file, ukuran file, kemudahan vs fleksibilitas, ...)?

Jonallard
sumber
2
Adakah yang bisa menjelaskan dari mana rsync datang untuk memainkan semua ini?
Konerak
Jonallard, tolong jangan tambahkan jawaban untuk pertanyaan (tidak benar-benar masuk akal untuk melakukan ini, bukan?) - jika Anda merasa beberapa jawaban memerlukan info tambahan, Anda dapat menyarankan pengeditan pada mereka, atau buat jawaban Anda sendiri yang merangkum semuanya!
slhck

Jawaban:

65

Dalam lingkungan Linux, untuk keamanan dan kemudahan penggunaan, ssh adalah cara terbaik untuk maju. SSH, SSHFS, SCP, dan SFTP seperti yang Anda daftarkan adalah semua layanan berbeda yang dibangun di atas protokol SSH. SCP sangat mudah digunakan, ini berfungsi seperti CP tetapi Anda dapat memberikan nama pengguna dan mesin di jalurnya. Jadi, kita mungkin melakukan CP seperti cp ~/music/ ~/newmusic/, tetapi kita bisa dengan mudah melakukannya scp ~/music/ user@host:~/newmusicuntuk mengirimkannya ke komputer bernama host. Itu saja - kita tidak perlu mengatur apa pun. Anda akan dimintai kata sandi akun di mesin lain jika Anda tidak memiliki sertifikat atau beberapa autentikasi yang disiapkan (scp berbagi pengaturan tersebut dengan ssh, tentu saja).

SFTP adalah alat yang membuatnya mudah untuk melakukan banyak operasi pada sistem file jarak jauh - ia berfungsi seperti FTP, tetapi dijalankan melalui SSH sehingga aman dan hanya membutuhkan server SSH. man sftpakan memberi tahu Anda semua tentang cara menggunakannya. Saya tidak menggunakan SFTP hanya untuk memindahkan folder di antara dua mesin, itu lebih berguna ketika Anda memiliki banyak operasi yang harus dilakukan, seperti jika Anda mengatur ulang file di komputer lain.

SSHFS hanya memperluas SFTP ke sistem file: ini memungkinkan Anda untuk memasang host virtual ke sistem file Anda, sehingga hal-hal jaringan terjadi secara sangat transparan. SSHFS adalah untuk pengaturan semi-permanen, bukan hanya transfer file satu kali. Dibutuhkan lebih banyak upaya untuk mengatur, yang dapat Anda baca di situs web proyek .

Jika Anda perlu bekerja di lingkungan OS campuran, Samba menjadi taruhan terbaik Anda berikutnya. Windows dan OS X mendukung Samba sepenuhnya secara otomatis, dan Linux juga melakukannya meskipun kadang-kadang kasar untuk digunakan.

jcrawfordor
sumber
3
Jenis jawaban yang saya inginkan: lengkap, lengkap, terperinci, to the point.
jonallard
2
Namun satu hal, untuk scpbekerja, apakah kita perlu mengatur semacam server ssh, pendengar atau membuka blokir sesuatu di sisi lain? Saya mendapatkan kesalahan "Sambungan ditolak".
jonallard
2
scp menggunakan ssh, jadi itu akan berfungsi jika SSH bekerja. Ini berarti, tentu saja, bahwa Anda perlu menjalankan server SSH (default di setiap distro linux yang saya ketahui) dan koneksi harus dimungkinkan (firewall, NAT, dll harus memiliki pengecualian yang sesuai).
jcrawfordor
8
Rupanya openssh-serverharus diinstal di Ubuntu Natty.
jonallard
3
Catatan yang sshmenggunakan enkripsi, yang akan menyebabkan beberapa overhead tambahan. Jika komputer yang terlibat memiliki CPU yang cukup lambat, ini mungkin membuat perbedaan. Dalam hal itu netcatatau yang serupa (lihat jawaban Caspar) mungkin lebih disukai. Tentu saja hanya jika Anda tidak benar-benar membutuhkan enkripsi (dalam LAN yang dilindungi).
sleske
59

Favorit pribadi saya untuk kasus-kasus di mana keamanan tidak penting adalah netcat + tar :

Untuk mengirim direktori, cd ke dalam direktori yang isinya ingin Anda kirim di komputer melakukan pengiriman dan lakukan:

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

Di komputer yang menerima konten, cd ke tempat Anda ingin konten muncul dan lakukan:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

Ganti $REMOTE_HOSTdengan ip / hostname komputer yang melakukan pengiriman. Anda juga dapat menggunakan port lain sebagai ganti 45454.

Apa yang sebenarnya terjadi di sini adalah bahwa komputer 'penerima' terhubung ke komputer pengirim pada port 45454 dan menerima isi tar dan gzip dari direktori, dan mengirimkannya langsung ke tar (dan gzip) untuk mengekstraknya ke dalam direktori saat ini.

Contoh cepat (menggunakan localhost sebagai host jarak jauh)

Komputer 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

Komputer 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
sumber
agak mengingatkan saya pada sendnet dan recnet dari layanan IPX Novel dari masa lalu ...
sum1stolemyname
4
## netcat + bzip2 mungkin sedikit lebih cepat pada koneksi yang lambat ## Mengirim server # cat file.txt | bzip2 -c | nc-l 1234 ## Server penerima # nc $ send_ip 1234 | bzip2 -cd> file.txt
shantanuo
@ Caspar: Bagaimana dengan mengedit jawaban ini untuk menyarankan kompresi bzip2 atau lzma?
einpoklum - mengembalikan Monica
4
yang -qpilihan menunjukkan bahwa Anda menggunakan openbsd-netcat , sementara gnu-netcat juga cukup umum (default di Arch Linux ). Bisakah Anda memperluas jawaban Anda dengan menyertakan sintaks gnu-netcat ?
Sebastian
1
Pria nc saat ini mengatakan tentang opsi -l: "Ini adalah kesalahan untuk menggunakan opsi ini dalam hubungannya dengan opsi -p, -s, atau -z", tetapi anehnya itu tidak menimbulkan kesalahan saat menggunakannya. Saya pikir menggunakan 'nc -l 45454' harus bekerja dengan baik.
Claudiu
19

Untuk sekali gerakan, scp disarankan.

Tetapi jika Anda menemukan bahwa dir ini dapat berfungsi dan Anda perlu memindahkannya berkali-kali agar posisi lain diperbarui, Anda dapat menggunakan rsync (with ssh).

Karena rsync memiliki banyak argumen, saya biasanya memasukkannya ke dalam shell kecil jadi saya memperbaikinya (setiap waktu). Idenya adalah hanya mengirim hal-hal yang telah berubah sejak terakhir kali dijalankan.

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

Ini akan memindahkan direktori yang disebut "/ home / media / music /" dari komputer lokal ke komputer bernama 192.168.0.33, menggunakan pengguna "nisse". Dan hapus apapun pada target yang tidak ada pada pc lokal.

Johan
sumber
1
+ untuk rsync, yang tampaknya sedikit lebih cepat dan sangat bagus jika Anda harus menyinkronkan direktori nanti
Wiesław Herr
Ini tampaknya sangat menjanjikan (dan mudah digunakan kembali) tapi saya punya dirs dan file dengan spasi dan saya mendapatkan error rsync: sintaks atau kesalahan penggunaan (kode 1) di main.c (1348) [sender = 3.1.1] - - Ada saran?
Torben Gundtofte-Bruun
8

Saya akan merekomendasikan Anda mencoba alternatif daripada langsung dengan SSH untuk memindahkan file di dalam LAN Anda sendiri karena overhead adalah IMMENSE. Saya akan menggunakan solusi Caspar jika ini karena alasan apa pun tidak akan berhasil untuk Anda:

Pada sumber:

$ python3 -m http.server {PICK_YOUR_PORT}

Di tempat tujuan:

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

Ini tidak hanya lebih ringan daripada menggunakan SSH tetapi jauh lebih cepat dengan kecepatan berkisar 45 ~ 65MiB pada standar CAT6 UTP.
Jika Anda benar-benar ingin memeras maksimal dari koneksi coba ganti wgetdengan lftpdan gunakan pget -n20dan mirror -rperintah.

cig0
sumber
7

Mungkin yang tercepat netcat(seperti yang dijelaskan caspar).

Saya suka kombinasi tar& ssh, yang aman dan masih cepat:

Tentang sumbernya

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

Melakukannya sebagai root, ia mempertahankan izin file. Atau gunakan -pdi kedua sisi. Juga -Sdapat dipertimbangkan jika Anda memiliki file jarang.

Dimungkinkan untuk mengurangi overhead enkripsi sshjika Anda menggunakan arcfoursebagai cipher yang berfungsi dengan openSSH:

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

Untuk memperbarui jalur jarak jauh, rsyncsempurna:

rsync -av --sparse --delete -e "ssh -c arcfour" . root@targethost:/target/path
Tim Haegele
sumber
1
FWIW, saya baru-baru ini melakukan tes transfer antara dua laptop modern yang terhubung langsung menggunakan rsync baik dengan opsi arcfour dan tidak ada argumen khusus -e. Saya perhatikan tidak ada perbedaan dalam kecepatan.
Randy Syring
4

Jika benar-benar harus dilakukan melalui LAN, saya akan menggunakan rsync, karena akan mengambil di mana ia tinggalkan jika terputus. Ini juga memiliki beberapa trik lain untuk meminimalkan jumlah data yang ditransfer, meskipun saya ragu bahwa banyak / salah satu dari mereka akan relevan dengan kasus menyalin perpustakaan musik ke lokasi yang masih perawan. Jika keamanan menjadi perhatian, atur RSYNC_RSH=sshterlebih dahulu dan data akan disalurkan melalui ssh.

Jika saya benar-benar melakukannya, saya mungkin tidak akan menggunakan LAN sama sekali. Saya akan menyalin file ke, kemudian mematikan, hard drive USB. Dalam pengalaman saya, ini dapat dengan mudah beberapa kali lipat lebih cepat daripada melewati LAN, meskipun harus menyalin file dua kali - USB 2.0 dinilai untuk 480Mbps, yang lebih cepat dari apa pun yang kekurangan gigabit ethernet, plus itu kurang sensitif terhadap kondisi yang akan menurunkan kinerja LAN. Ini juga sepenuhnya OS-independen, asalkan Anda menggunakan sistem file yang dapat ditangani oleh semua mesin yang terlibat - Saya akan merekomendasikan VFAT / FAT32, karena itu cukup universal.

Dave Sherohman
sumber
1
Saya adalah penggemar dari (yang disebut) sneakernet juga, tetapi ada baiknya menunjukkan bahwa sementara USB 2 seharusnya bisa mendapatkan 480Mbps, saya hanya pernah melihatnya mendapat 30MB / s (sekitar 240Mbps). mungkin saya hanya punya USB murah <-> perangkat keras SATA;) Juga, FAT32 cukup universal tetapi tidak boleh untuk menyalin hal-hal seperti gambar DVD karena kendala filesize 4gb; itu layak ditunjukkan sehingga orang tidak terlalu frustrasi dengan pesan kesalahan "keluar dari ruang" yang diberikan Windows (setidaknya).
Caspar
@ Caspar: Peringatan bagus! Terima kasih telah menyebutkannya; Saya selalu lupa tentang batas ukuran file FAT32 ...
Dave Sherohman
2

Saya akan menyarankan rsync karena akan menyalin file secara bertahap. Anda dapat mengaturnya untuk menyalin hanya file yang diubah atau baru hanya setelah Anda melakukan pembaruan awal. Anda dapat menggunakan ssh sebagai lapisan transport jika diinginkan.

Sardathrion
sumber
1

Saya menggunakan Unison , yang merupakan sinkronisasi file yang luar biasa pada banyak protokol berbeda. Anda bisa mengkonfigurasinya untuk menggunakan scp, rcp, ftpatau bahkan secara lokal pada filesystem antara dua folder. Saya menggunakannya untuk menyinkronkan perpustakaan musik saya, karena dapat mentransfer banyak file sekaligus melalui jaringan dan benar-benar bisa disetel dalam konfigurasinya. Saya menyimpan cadangan koleksi musik saya dan menyinkronkan lebih dari 2-3 komputer. Itu hanya akan menyalin file yang diubah, dan melakukannya dengan menjaga indeks di kedua ujung transfer sehingga dapat mengetahui kapan klien telah mengubah file atau ketika file server telah berubah.

Jarak tempuh Anda mungkin berbeda, tetapi tentu saja jauh lebih baik daripada memasukkan scpseluruh koleksi musik Anda setiap kali Anda menambahkan lagu baru :)

Naftuli Kay
sumber
0

Saya mengikuti proses ssh untuk login tanpa kata sandi terlebih dahulu http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

Untuk skrip dan file teks berikut ini berfungsi baik untuk saya

Untuk mentransfer data dari host lokal ke host jarak jauh. cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

Untuk mentransfer data dari host jarak jauh ke host lokal. ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

Ini berfungsi bagi saya untuk mentransfer file pada sistem embedded yang tidak memiliki klien ssh atau scp.

Tidak scp - hanya ssh.

antusiasme
sumber