web-dev-qa-db-ja.com

まだssh経由で書き込まれているファイルをコピーする方法は?

ここに状況があります:

  1. Sftpを使用してクライアントAからサーバーに大きなファイルをアップロードしています。
  2. このファイルをサーバーからクライアントBにssh経由でダウンロードする必要もあります。

クライアントAからのアップロードがまだ行われているときに、サーバーからクライアントBへの転送を開始します。

これを行うための最良の方法/ツールは何ですか?

[〜#〜]更新[〜#〜]

これまでの回答は興味深いものです。必ず読んですべてテストします。クライアントAがファイルをアップロードする方法の制御に依存しない回答に対するボーナスポイント。 (つまり、クライアントAから知っている唯一のことは、ファイルが既知のファイル名に書き込まれていることです。)

20
Steven D

現時点では試すことができないため、失敗する可能性があります。私の考えは次のとおりです。ファイルがクライアントBに到着するディレクトリをマウントします。クライアントのファイルシステムの/ mnt/serverにsshfsを使用b。その後

tail -c +0 -f /mnt/server/thefileinquestion > ~/finalfile
5
fschmitt

あなたはそれのためにFIFOを使うことができました。簡単にするために、sshを使用せずに2つのxtermのみを含めます。

Xterm Aで:

$ mkfifo fif
$ cat test.tar.gz | tee copy.tar.gz > fif

Xterm Bで:

$ cat fif > dest.tar.gz
$ cmp test.tar.gz dest.tar.gz
$ echo $?
0
$ cmp test.tar.gz copy.tar.gz
$ echo $?
0

Sshを使用する場合、次のようになります。おそらく、sshでエスケープ文字を無効にする必要があります(-e none)。

クライアントA:

 $ ssh server mkfifo fif
 $ cat src.tar.gz | ssh "tee fif > copy.tar.gz"

クライアントB:

 $ ssh server cat fif > dest.tar.gz
1
maxschlepzig

元のポスターのように解決策が必要な状況があります。ホッケーゲームを1か所のコンピューターで録画しています。別の場所のテレビで観たいのですが。 2つの場所間のリンクにより、コピーは約1.3Mb/sで送信され、録画ビデオは約1.5Mb/sになります。それで、録音を開始するときにファイルをコピーしたいと思います。このようにして、私の3時間のゲームは約3.5時間でコピーされます。だから、録画開始と同時にコピーして、30分後に視聴を始められます。そうすれば、中断することなく、ほぼリアルタイムでそれを見ることができます。つまり、新しいファイルの書き込みと同じようにコピーできる限りです。 rsyncやscpなどのツールの問題は、コピーを開始するときにファイルのサイズを確認し、その量のデータをコピーすると終了することです。そのコピー中にファイルが2倍以上大きくなったとしても。そして、もし私がループでrsyncを使用してそれを停止したらそれをコピーしている場合、次のrsyncが完了すると、ターゲットファイルが再構築され、ビデオプレーヤーが強制終了します。それが突然それを殺したときにプログラムで。私はより良い解決策を望んでいて、それを見つけることができなかったので、代わりにこれを組み合わせました:

dd if=2031_20160514030000.mpg |
pv --size 4653819304 |
ssh -C -c arcfour,blowfish-cbc -p 5555 myserver.com 'dd of=/media/TV/2031_20160514030000.mpg'

これは何をするのでしょうか?

まず、ddを使用して、ファイルが大きくなるにつれてファイルをコピーします。ファイルはddがネットワーク経由で送信できるよりも速く成長するため、ddがファイルの終わりに追いつくことはありません。次に、それを「pipe viewer(pv)」にパイプし、これらのファイルの通常の大きさに基づいて、ファイルの大きさの見積もりを出します。これは必須ではありませんが、進行状況メーターを確認するのが好きです。次に、パイプを使用してssh接続にストリームを送ります。 ssh接続は-Cを使用して圧縮し(ネットワーク帯域幅を減らして高速化しようとします)、-c arcfour,blowfish-cbcを使用して最も安価な暗号化を行い(ここでも少し高速化)、-pは宛先で使用しているファイアウォールポート用で、sshは最終的にターゲットでddコマンドを実行して、ファイルを受信したときにファイルを再作成します。このソリューションは非常に効果的です。ファイルの作成とコピーが行われている間、ほんの少しの遅延でホッケーゲームを見ることができます。

1
Neophraz

私はこれがうまくいくと思います:

user@clientA:~$ cat file | ssh server "cat > dest"

その後

user@clientB:~$ ssh server "tail +0 -f dest" > file

スループットを確認する場合は、pvコマンドを追加します。

1
wiretapped

Tail -fメソッドが機能するかどうかはわかりません(ただし、ファイルがテキストの場合は機能します)。その理由は、tail -fとsftpがどのように転送してメタ情報に依存しているかがわからないためです。

Sftpが最初にメタ情報を転送し、tail -fがメタ情報に依存してそれ以上ファイルがないことを通知する場合、tailはEOFまたはnullを使用して末尾を不正にする可能性があります。

アップロードのパスを気にしない場合、つまりコンピュータ1がコンピュータ2にアップロードし、コンピュータ3にアップロードする場合は、sftpの代わりにbittorentを使用してみてください。それがそのために設計されたようです。

0
HandyGandy

ファイルを最初から読み取ろうとすることもできますが、少なくとも同じ速度で書き込めることを確認する必要があります。

0
Tim Connor