web-dev-qa-db-ja.com

2台のLinuxコンピュータ間でLAN経由でファイルを転送するための最良の方法

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

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

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

  • sSH
  • sshfs
  • scp
  • sftp
  • nfs
  • サンバ
  • 与える

最も簡単なものは何ですか?最も柔軟な?最も簡単?最善の解決策は?それぞれの長所と短所は何ですか?他の(より良い)選択肢はありますか?最適な方法を選択する際のパラメータは何ですか(解決策は、ファイル数、ファイルサイズ、使いやすさ対柔軟性などによって異なる場合があります)。

76
jonallard

Linux環境では、セキュリティと使いやすさの両面から、sshが最善の方法です。リストにあるSSH、SSHFS、SCP、およびSFTPはすべて、SSHプロトコルの上に構築された単なる異なるサービスです。 SCPは非常に使いやすく、CPのように機能しますが、パスにユーザー名とマシン名を指定できます。そのため、cp ~/music/ ~/newmusic/のようにCPを実行することもできますが、scp ~/music/ user@Host:~/newmusicをHostというコンピュータに送信するのと同じくらい簡単に実行できます。これで終わりです - 何も設定する必要はありません。証明書やその他の認証が設定されていない場合は、他のマシンのアカウントパスワードの入力を求められます(もちろん、scpはこれらの設定をsshと共有します)。

SFTPはリモートファイルシステム上で多くの操作を簡単に行えるツールです - それはFTPのように動作しますが、SSHを通して実行されるので安全でSSHサーバーのみが必要です。 man sftpはそれをどのように使うかについてあなた全員に話します。 2台のコンピュータ間でフォルダを移動するためだけにSFTPを使用するのではありません。他のコンピュータでファイルを並べ替える場合のように、多くの操作が必要な場合は便利です。

SSHFSはSFTPをファイルシステムに拡張するだけです。仮想ホストをファイルシステムにマウントすることを可能にするので、ネットワークのことは完全に透過的に行われます。 SSHFSは、一時的なファイル転送ではなく、半永久的なセットアップ用です。設定にはもう少し手間がかかりますが、これについては プロジェクトWebサイト を参照してください。

OSが混在する環境で作業する必要がある場合は、Sambaが次に最善の策となります。 WindowsとOS XはSambaを完全に自動的にサポートし、Linuxは時々使うのが面倒だが同様にサポートする。

64
jcrawfordor

セキュリティが問題にならない場合の私の個人的なお気に入りは netcat + tar

ディレクトリを送信するには、内容を送信したいディレクトリの内側にcdして送信します。

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
56
Caspar

一度だけ移動する場合は、scpをお勧めします。

しかし、このディレクトリが機能する可能性があり、他の位置を更新し続けるために何度も移動する必要がある場合は、rsync(ssh付き)を使用できます。

Rsyncにはたくさんの引数があるので、私はそれを小さなShellに入れて、正しい結果を得ます(毎回)。これは、前回の実行以降に変更されたものだけを送信するという考え方です。

#!/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上に存在しないターゲット上のものをすべて削除します。

19
Johan

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

ソースで:

$ python3 -m http.server {PICK_YOUR_PORT}

目的地で:

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

これはSSHを使うより軽いわけではありませんが、標準のCAT6 UTPで45〜65MiBの速度ではるかに速くなります。
本当に接続を最大限に活用したい場合は、wgetlftpに置き換え、pget -n20およびmirror -rコマンドを使用してみてください。

7
cig0

最速のものはおそらくnetcatです(casparが説明したように)。

私はtarsshの組み合わせが好きです。

ソース上

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

これをrootとして実行しても、ファイルのアクセス権は保持されます。または両側に-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
7
Tim Haegele

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

私が実際にそれをやっていたならば、私はおそらくLANをまったく使用しないでしょう。ファイルをUSBハードドライブにコピーしてからコピーします。私の経験では、ファイルを2回コピーする必要があるにもかかわらず、LANを経由するよりも簡単に数桁速くなる可能性があります。USB2.0は480Mbpsと評価されています。 LANのパフォーマンスが低下します。関連するすべてのマシンが処理できるファイルシステムを使用している場合は、完全にOSに依存しません。VFAT/ FAT32をお勧めします。これは非常に一般的な方法です。

4
Dave Sherohman

Rsyncはファイルを段階的にコピーするので推奨します。最初の更新が終わったら、変更されたファイルまたは新しいファイルのみをコピーするように設定できます。あなたが望むならあなたはトランスポート層としてsshを使うことができます。

2
Sardathrion

私は Unison を使用します。これは多くの異なるプロトコル上で素晴らしいファイルシンクロナイザです。 scprcpftp、あるいは2つのフォルダ間のファイルシステム上でローカルに使用するように設定することができます。ネットワークを介して一度に複数のファイルを転送することができ、その構成を実際に調整できるので、私はそれを私の音楽ライブラリを同期させるために使用します。私は自分の音楽コレクションを2〜3台のコンピュータでバックアップし同期しています。変更されたファイルのみをコピーし、クライアントがいつファイルを変更したのか、サーバーファイルが変更されたのかを判断できるように、転送の両端にインデックスを保持します。

あなたの走行距離は異なるかもしれませんが、それは確かにあなたが新しい曲を追加するたびにあなたの音楽コレクション全体をscpingすることよりずっと良いです:)

1
Naftuli Kay

私は最初にパスワードなしのログインのための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のみ。

0