İki Linux bilgisayar arasında LAN üzerinden dosya aktarmanın en iyi yolu


77

İki Linux bilgisayar arasında dosya (müzik klasörü) aktarmak istiyorum. Bunu yapmanın en iyi yolunu aradıktan sonra , bunu yapmanın birçok yolu olduğunu gördüm . Bunun istendi biliyorum çok , her yerde ve her zaman . Bununla ilgili temel sorun, Linux'ta yeni başlayanlar için (bazı parametrelere bağlı olarak) 2011'de bu işi yapmanın en iyi yolu hakkında net ve yakın tarihli bir görüş birliği olmamasıdır.

Bu yüzden, Stack Exchange web sitelerinin ruhuna göre, bunun benim özel durumumla ilgili olmamasını değil, başkalarının yanı sıra yerel bir ağ üzerinden iki Linux bilgisayar arasında nasıl dosya transfer edileceğine dair daha fazla rehberlik etmek istiyorum. Bir wiki'nin birçokları için faydalı olacağını düşünüyorum.

İşte şimdiye dek ne buldum:

  • sSH
  • sshfs
  • scp
  • sftp
  • nfs
  • samba
  • verici

En kolay olan nedir? En esnek? En basit? En iyi çözüm? Her birinin avantajları ve dezavantajları nelerdir? Başka (daha iyi) seçenekler var mı? En iyi yöntemi seçmedeki parametreler nelerdir (çözüm, dosya sayısına, dosya boyutuna, kolaylık ve esnekliğe bağlı olabilir ...)?


2
Bu konuda rsync'in nerede çalacağını kimse açıklayabilir mi?
Konerak

jonallard, eklemeyin cevapları için söz bazı cevaplar ek bilgiye ihtiyaç hissedersen, onlara düzenleme önermesine veya kendi cevap oluşturabilirsiniz - (? yapar, gerçekten bunu yapmak mantıklı değil) Bu her şeyi özetliyor!
slhck

Yanıtlar:


65

Bir Linux ortamında, hem güvenlik hem de kullanım kolaylığı için, ssh, gitmek için en iyi yoldur. SSH, SSHFS, SCP ve sizin de listelediğiniz SFTP’lerin tümü, SSH protokolünün üzerine inşa edilmiş farklı servislerdir. SCP'nin kullanımı çok kolaydır, tıpkı CP gibi çalışır ancak yolda kullanıcı ve makine adları sağlayabilirsiniz. Öyleyse, CP gibi bir cp ~/music/ ~/newmusic/şey yapabiliriz, ancak bunu scp ~/music/ user@host:~/newmusicana bilgisayar adındaki bilgisayara göndermek için kolayca yapabiliriz . İşte bu - hiçbir şey kurmamız gerekmiyor. Sertifikanız veya başka bir kimlik doğrulama ayarınız yoksa, diğer makinedeki hesap şifresini girmeniz istenir (scp elbette bu ayarları ssh ile paylaşır).

SFTP, uzak bir dosya sisteminde çok fazla işlem yapmayı kolaylaştıran bir araçtır - tıpkı FTP gibi çalışır, ancak SSH üzerinden çalışır, bu nedenle güvenlidir ve yalnızca bir SSH sunucusu gerektirir. man sftpnasıl kullanılacağı hakkında tüm anlatacağım. Sadece iki makine arasında bir klasörü taşımak için SFTP kullanmıyorum, başka bir bilgisayardaki dosyaları yeniden düzenliyormuşsunuz gibi yapacak çok işiniz olduğunda daha kullanışlıdır.

SSHFS, SFTP'yi bir dosya sistemine genişletir: sanal bir ana bilgisayarı dosya sisteminize bağlamanıza izin verir, böylece ağ işleri tamamen saydam olur. SSHFS, yalnızca bir defalık bir dosya aktarımı için değil, yarı kalıcı kurulumlar içindir. Proje web sitesinde okuyabileceğiniz kurulum yapmak için biraz daha çaba gerekiyor .

Karma işletim sistemi ortamında çalışmanız gerekiyorsa, Samba bir sonraki en iyi bahsiniz olur. Windows ve OS X, Samba'yı tamamen otomatik olarak destekliyor ve bazen kullanımı zor olsa da, Linux da destekliyor.


3
Tam da istediğim cevap türü: tam, ayrıntılı, ayrıntılı.
jonallard

2
Bir şey olsa da, scpçalışmak için bir çeşit ssh sunucusu, dinleyici ya da diğer tarafta bir şeyin engelini kaldırmamız mı gerekiyor? "Bağlantı reddedildi" hataları alıyorum.
jonallard

2
scp ssh kullanır, bu yüzden SSH çalışıyorsa çalışacaktır. Bu, elbette, çalışan bir SSH sunucunuzun olması gerektiği (farkında olduğum her linux dağıtımında varsayılan olarak) ve bir bağlantının mümkün olması gerektiği (güvenlik duvarları, NAT vb. Uygun istisnalar olması gerektiği) anlamına gelir.
jcrawfordor

8
Görünüşe göre openssh-serverUbuntu Natty'ye kurulması gerekiyor.
jonallard

3
Not sshbazı ek yükü neden olacaktır şifrelemesi kullanılıyor. İlgili bilgisayarlar oldukça yavaş işlemcilere sahipse, bu fark yaratabilir. Bu durumda netcatveya benzeri (Caspar'ın cevabına bakınız) tercih edilebilir. Tabii ki sadece gerçekten şifrelemeye ihtiyacınız yoksa (korumalı bir LAN'da).
sleske,

59

Güvenliğin önemli olmadığı durumlar için kişisel favorim netcat + tar :

Bir dizini göndermek için, içeriğini göndermek istediğiniz dizini bilgisayara gönderin ve gönderme yapın:

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

İçeriği alan bilgisayarda, içeriğin görünmesini ve yapılmasını istediğiniz yere cd:

nc -w 10 $REMOTE_HOST 45454 | tar -xz

$REMOTE_HOSTGönderen bilgisayarın ip / hostname ile değiştirin . Bunun yerine farklı bir bağlantı noktası da kullanabilirsiniz 45454.

Aslında burada olan şey, 'alıcı' bilgisayarın 45454 numaralı bağlantı noktasındaki gönderen bilgisayara bağlanması ve dizinin tar'd ve gzip'd içeriğini alması ve bunu doğrudan tar (ve gzip) 'a aktarmasıdır. geçerli dizin.

Hızlı örnek (localhost'u uzaktaki bir sunucu olarak kullanmak)

Bilgisayar 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

Bilgisayar 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

biraz eskiden Romanların ipx servislerinden sendnet ve recnet'i hatırlatıyor ...
sum1stolemyname

4
## netcat + bzip2 yavaş bağlantılar üzerinde biraz daha hızlı olabilir ## Gönderme sunucusu # cat file.txt | bzip2 -c | nc -l 1234 ## Sunucu alınıyor # nc $ sending_ip 1234 | bzip2 -cd> file.txt
shantanuo

@Caspar: bzip2 veya lzma sıkıştırması önermek için bu cevabı düzenlemeye ne dersiniz?
einpoklum

4
bu -qseçenek openbsd-netcat kullandığınızı belirtirken gnu-netcat de oldukça yaygındır ( Arch Linux'ta varsayılan ). Cevabınızı, gnu-netcat'in sözdizimini içerecek şekilde genişletebilir misiniz ?
Sebastian

1
Şu anki nc adamı -l seçeneği hakkında şunları söylüyor: "Bu seçeneği -p, -s veya -z seçenekleriyle birlikte kullanmak bir hatadır", ancak garip bir şekilde kullanırken hata atmıyor. Ben 'nc-l 45454' kullanarak da aynı şekilde çalışması gerektiğini düşünüyorum.
Claudiu

19

Bir kez hamle için scp önerilir.

Ancak bu dir'in çalışabileceğini ve diğer pozisyonu güncel tutmak için defalarca hareket ettirmeniz gerektiğini tespit ederseniz rsync (ssh ile) kullanabilirsiniz.

Rsync'in çok fazla argümanı olduğundan, genellikle küçük bir kabuğa koyarım (böylece her zaman). Buradaki fikir yalnızca koştuğu son zamandan beri değişen şeyleri göndermek.

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

Bu, "/ home / media / music /" adlı bir dizini yerel bilgisayardan "nisse" kullanıcısını kullanarak 192.168.0.33 adlı bilgisayara taşıyacak. Ve yerel bilgisayarda bulunmayan hedef üzerindeki her şeyi silin.


1
+ rsync için biraz daha hızlı görünüyor ve dizini daha sonra senkronize etmek zorunda kalırsanız çok hoş
Wiesław Herr

Bu çok umut verici (ve kolayca yeniden kullanılabilir) görünüyor ancak boşlukları olan dir ve dosyalarım var ve rsync hatası alıyorum: sözdizimi veya kullanım hatası (kod 1) main.c (1348) [gönderen = 3.1.1] - - baska öneri?
Torben Gundtofte-Bruun,

8

Genel gider IMMENSE olduğundan, dosyaları kendi LAN'ınız içinde taşımak için doğrudan SSH ile gitmek yerine alternatifleri denemenizi tavsiye ederim. Herhangi bir nedenden dolayı sizin için işe yaramazsa, Caspar'ın çözümüyle giderdim:

Kaynağında:

$ python3 -m http.server {PICK_YOUR_PORT}

Hedefte:

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

Bu sadece SSH kullanmaktan daha hafif olmayacak, aynı zamanda standart CAT6 UTP'de 45 ~ 65MiB arasında değişen hızlarda çok daha hızlı olmayacaktır.
Gerçekten sıkmak istiyorsanız bağlantının en iyi şekilde değiştirmeyi deneyin wgetile lftpve kullanma pget -n20ve mirror -rkomutlar.


7

En hızlı olasılıkla netcat(caspar tanımlandığı gibi).

Güvenli ve hala hızlı olan tar& kombinasyonunu seviyorum ssh:

Kaynak

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

Kök olarak yapmak, dosya izinlerini korur. Veya -pher iki tarafta da kullanın . Ayrıca -Ssize seyrek dosyalar varsa düşünülebilir.

OpenSSH ile çalışan şifre olarak sshkullanıyorsanız şifrelemenin ek yükünü azaltmak mümkündür arcfour:

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

Uzak yolu güncellemek için rsyncmükemmel:

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

1
FWIW, yakın zamanda, hem arcfour seçeneğiyle hem de belirli bir argüman olmadan, rsync kullanarak doğrudan bağlanan iki modern dizüstü arasında bir transfer testi yaptım. Hızlarda hiçbir fark olmadığını fark ettim.
Randy Syring,

4

Eğer LAN üzerinden kesinlikle yapılması rsyncgerekiyorsa, kesilirse bıraktığı yerden alacağı için kullanırdım. Ayrıca, aktarılan veri miktarını en aza indirgemek için bir kaç püf noktası daha var, ancak birçoğunun / herhangi birinin bakire bir yere kopyalanması durumunda olacağından şüpheliyim. Güvenlik bir endişe ise, sadece RSYNC_RSH=sshilk önce ayarlayın ve veriler ssh üzerinden tünellenecektir.

Aslında yapıyor olsam da, muhtemelen LAN kullanmam. Dosyaları bir USB sabit diskine kopyalardım. Deneyimlerime göre, dosyaları iki kez kopyalamak zorunda kalmasına rağmen, LAN üzerinden geçmekten çok daha hızlı bir şekilde çok sayıda büyüklükte olabilir - USB 2.0, gigabit ethernetten daha kısa olan herhangi bir şeyden daha hızlı olan 480Mbps değerindedir, ayrıca şartlara daha az duyarlıdır bu bir LAN'ın performansını düşürecektir. Ayrıca, tüm ilgili makinelerin kaldırabileceği bir dosya sistemi kullanmanız şartıyla tamamen işletim sisteminden bağımsızdır - VFAT / FAT32'yi tavsiye ederim, çünkü bu oldukça evrenseldir.


1
Ben de (sözde) gizlice sızan bir hayranıyım, ancak USB 2'nin 480Mbps alabileceği varsayılırken, sadece 30 MB / sn (yaklaşık 240Mbps) olduğunu gördüm. belki de sadece ucuz USB <-> SATA donanımım var;) Ayrıca, FAT32 de oldukça evrenseldir ancak 4 gb dosya boyutu kısıtlaması nedeniyle DVD görüntüleri gibi şeyleri kopyalamak için bir yol değildir; işaret etmeye değer, bu yüzden insanlar (en azından) Windows'un verdiği "alan dışı" hata mesajından çok fazla hüsrana uğramazlar.
Caspar

@Caspar: İyi uyarılar! Onlardan bahsettiğiniz için teşekkür ederiz; FAT32 dosya boyutu sınırını hep unutuyorum ...
Dave Sherohman

2

Dosyaları kademeli olarak kopyalayacağı için rsync'i öneririm. Yalnızca ilk güncellemeyi yaptıktan sonra yalnızca değiştirilmiş veya yeni dosyaları kopyalayacak şekilde ayarlayabilirsiniz. İsterseniz ssh'yi bir taşıma katmanı olarak kullanabilirsiniz.


1

Birçok farklı protokolde harika bir dosya senkronizörü olan Unison kullanıyorum . Bunu kullanmak için yapılandırabilirsiniz scp, rcp, ftpiki klasör arasındaki dosya sistemi üzerinde bile yerel olarak veya. Müzik kitaplığımı senkronize etmek için kullanıyorum, çünkü ağ üzerinden aynı anda birden fazla dosyayı aktarabilir ve yapılandırmasında gerçekten ayarlanabilir. Müzik koleksiyonumu yedeklediğim halde 2-3 bilgisayar üzerinden senkronize tutuyorum. Yalnızca değiştirilen dosyaları kopyalar ve bir istemcinin dosyayı ne zaman değiştirdiğini veya sunucu dosyasının ne zaman değiştiğini anlayabilmek için aktarımın her iki ucunda da bir dizin tutar.

Kilometreniz değişebilir, ancak scpher yeni bir şarkı eklediğinizde tüm müzik koleksiyonunuzu hazırlamaktan kesinlikle çok daha iyi :)


0

Önce şifresiz giriş için ssh işlemini takip ettim: http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

Komut dosyaları ve metin dosyaları için aşağıdakiler benim için yeterlidir

Yerel ana bilgisayardan uzak ana bilgisayara veri aktarmak için. cat localfile | ssh <user>@<ip> "cat > <path>/<remotefile>"

Uzaktaki bilgisayardan yerel ana bilgisayara veri aktarmak için. ssh <user>@<ip> "cat > <path>/<remotefile>" | cat > localfile

Bu benim için yerleşik ssh istemcisi veya scp yerleşik olmayan gömülü sistemlerdeki dosyaları aktarmak için çalışıyor.

Scp yok - sadece ssh.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.