2台のLinuxコンピューター間でLANを介してファイルを転送する最良の方法


77

2台のLinuxコンピューター間でファイル(音楽フォルダー)を転送したい。これを行うための最良の方法を探した後、これを行う方法がたくさんあることがわかりました。私はこれが、どこでも、そしていつでもたくさん尋ねられことを知っています。これに関する主な問題は、Linux初心者向けに2011年にこのタスクを実行するための1つの最良の方法について、明確な、最近のコンセンサスがないことです(一部のパラメーターによっても)。

Stack Exchange Webサイトの精神では、これが特定の状況に関係するのではなく、ローカルネットワークを介して2台のLinuxコンピューター間でファイルを転送する方法に関する他のガイドにも関連するようにします。ウィキは多くの人に役立つと思います。

ここに私がこれまで見つけたものがあります:

  • ssh
  • sshfs
  • scp
  • sftp
  • nfs
  • サンバ
  • 贈り主

最も簡単なものは何ですか?最も柔軟ですか?一番簡単?最善の解決策は?それぞれの長所と短所は何ですか?他の(より良い)オプションはありますか?最適な方法を選択する際のパラメーターは何ですか(解決策は、ファイル数、ファイルサイズ、簡単さvs柔軟性などに依存する可能性があります)?


2
誰もがこのすべてでrsyncがどこでプレイするのか説明できますか?
コネラク

ジョナラード、質問に回答を追加しないでください(実際にこれを行うのは理にかなっていないのですか?)-追加情報が必要な回答がある場合は、編集を提案するか、独自の回答を作成できますすべてをまとめたものです!
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使用方法について説明します。2台のマシン間でフォルダーを移動するためだけにSFTPを使用するのではありません。別のコンピューターでファイルを再配置する場合など、多くの操作を行う必要がある場合に便利です。

SSHFSはSFTPをファイルシステムに拡張するだけです。仮想ホストをファイルシステムにマウントできるため、ネットワークの処理は完全に透過的に行われます。SSHFSは、1回限りのファイル転送ではなく、半永久的なセットアップ用です。設定にはさらに手間がかかります。これについては、プロジェクトのWebサイトで読むことができます。

混合OS環境で作業する必要がある場合は、Sambaが次善策となります。WindowsとOS XはSambaを完全に自動的にサポートし、Linuxも同様にサポートしますが、使用するのは難しい場合があります。


3
まさに私が望んでいた種類の答え:完全、網羅的、詳細、要点まで。
ジョナラード

2
ただし、機能するためscpには、ある種のsshサーバー、リスナーをセットアップする必要があるのか​​、または反対側で何かのブロックを解除する必要があるのですか?「接続拒否」エラーが表示されます。
ジョナラード

2
scpはsshを使用するため、SSHが機能していれば動作します。これは、もちろん、SSHサーバーを実行する必要があり(私が知っているすべてのLinuxディストリビューションのデフォルト)、接続が可能でなければならないことを意味します(ファイアウォール、NATなどには適切な例外が必要です)。
jcrawfordor

8
どうやらopenssh-serverUbuntu Nattyにインストールする必要があります。
ジョナラード

3
ssh暗号化を使用しているため、追加のオーバーヘッドが発生することに注意してください。関与するコンピューターのCPUがかなり遅い場合、これは違いを生じる可能性があります。その場合、netcatまたは類似したもの(Casparの答えを参照)が望ましい場合があります。もちろん、(保護されたLANで)実際に暗号化を必要としない場合のみ。
sleske

59

セキュリティが重要でない場合の私の個人的なお気に入りは、netcat + tarです。

ディレクトリを送信するには、送信中のコンピューターで送信したいコンテンツのあるディレクトリ内にcdして、次の操作を行います。

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

ちょっと...昔の小説のIPXサービスからsendnetとrecnetを思い出させる
sum1stolemyname

4
## netcat + bzip2は、低速接続では少し高速になる可能性があります##送信サーバー#cat file.txt | bzip2 -c | nc -l 1234 ##受信サーバー#nc $ sending_ip 1234 | bzip2 -cd> file.txt
shantanuo

@Caspar:この答えを編集して、bzip2またはlzma圧縮を提案してはどうですか?
アインポクルム-モニカを

4
この-qオプションは、openbsd-netcatを使用していることを示していますが、gnu-netcatも非常に一般的です(Arch Linuxのデフォルト)。gnu-netcatの構文を含むように答えを拡張していただけますか?
セバスチャン14年

1
現在のnc男性は、-lオプションについて次のように述べています。「-p、-s、または-zオプションと組み合わせてこのオプションを使用するとエラーになります」が、奇妙なことに使用時にエラーをスローしません。「nc -l 45454」を使用しても同様に機能するはずです。
クラウディウ14

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/

これにより、ユーザー「nisse」を使用して、「/ home / media / music /」というディレクトリがローカルコンピューターから192.168.0.33というPCに移動します。ローカルPCに存在しないターゲット上のものをすべて削除します。


1
+少し速いようで、後で上のディレクトリを同期する必要がある場合には非常にいいですrsyncを、のために
Wiesław君

これは非常に有望な(かつ簡単に再利用可能な)ようだが、私はスペースでのdirsやファイルを持っていると私は取得していますrsyncのエラー:構文や使用方法の誤りのmain.c(1348)で(コード1)[送信者= 3.1.1] - - 助言がありますか?
トーベンGundtofte・ブルーン

8

オーバーヘッドはIMMENSEなので、ファイルを自分のLAN内で移動するために、代わりにSSHを使用する代わりに代替手段を試すことをお勧めします。何らかの理由でこれがうまくいかない場合は、Casparのソリューションを使用します:

ソースで:

$ python3 -m http.server {PICK_YOUR_PORT}

目的地で:

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

これは、SSHを使用するよりも軽くなるだけでなく、標準のCAT6 UTPで45〜65MiBの速度ではるかに高速になります。
接続を最大限に活用したい場合は、and コマンドで置き換えwgetlftp使用してください。pget -n20mirror -r


7

おそらく最速はnetcat(キャスパーの説明通り)です。

私はtar&の組み合わせが好きでssh、これは安全でありながら高速です:

ソースで

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

これをルートとして実行すると、ファイルのアクセス許可が保持されます。または-p、両側で使用します。また、-Sあなたがスパースファイルを持っている場合、考えられるかもしれません。

openSSHで動作する暗号としてssh使用する場合の暗号化オーバーヘッドを減らすことができますarcfour

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引数なしで使用して、直接接続された2台の最新のラップトップ間で転送テストを行いました。速度に違いはありませんでした。
ランディシリンジ

4

LANを介して絶対に行うrsync必要がある場合は、中断すると中断したところから再開するため、を使用します。また、転送されるデータの量を最小限に抑えるためのいくつかの他のトリックもありますが、それらの多く/どれもが音楽ライブラリを未使用の場所にコピーする場合に関連するとは思いません。セキュリティが懸念される場合は、RSYNC_RSH=ssh最初に設定するだけで、データはsshでトンネリングされます。

ただし、実際に実行している場合は、おそらくLANをまったく使用しないでしょう。ファイルをUSBハードドライブにコピーした後、USBハードドライブからコピーします。私の経験では、ファイルを2回コピーする必要があるにもかかわらず、LANを経由するよりも簡単に数桁高速になります-USB 2.0は480Mbpsに格付けされています。 LANのパフォーマンスが低下します。また、関連するすべてのマシンが処理できるファイルシステムを使用していれば、完全にOSに依存しません。


1
私は(いわゆる)スニーカーネットのファンでもありますが、USB 2は480Mbpsを取得できるはずですが、30MB / s(約240Mbps)を取得するのを見たことがあることを指摘する価値があります。多分私はただ安いUSB <-> SATAハードウェアを持っている;)また、FAT32はほとんど普遍的であるが、4GBのファイルサイズの制約のためにDVDイメージのようなものをコピーするための行くことはない。Windowsが(少なくとも)表示する「スペース不足」エラーメッセージに人々がイライラしないように、指摘する価値があります。
キャスパー

@キャスパー:良い注意点!それらに言及してくれてありがとう。私はいつも... FAT32ファイルサイズの上限を忘れる
デイブSherohman

2

ファイルをインクリメンタルにコピーするため、rsyncをお勧めします。最初の更新が完了したら、変更されたファイルまたは新しいファイルのみをコピーするように設定できます。必要に応じて、トランスポート層としてsshを使用できます。


1

私はUnisonを使用します。これは、多くの異なるプロトコルに対応した素晴らしいファイルシンクロナイザーです。あなたはそれを使用するように設定することができscprcpftp2つのフォルダ間のファイルシステム上でも、ローカルまたは。ネットワークを介して複数のファイルを一度に転送でき、その構成を実際に調整できるため、音楽ライブラリを同期するために使用します。音楽コレクションをバックアップし、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のみ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.