SSHを介してまだ作成中のファイルをコピーする方法は?

SSHを介してまだ作成中のファイルをコピーする方法は?

詳細は次のとおりです。

  1. 私はsftpを使用してクライアントAからサーバーに大容量ファイルをアップロードしています。
  2. また、SSHを介してサーバーからクライアントBにファイルをダウンロードする必要があります。

私が望むのは、クライアントAがまだアップロードしている間、サーバーからクライアントBへの転送を開始することです。

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

修正する:

これまでの答えは面白いです。ぜひ読んでテストしてみましょう。クライアントAがファイルをアップロードする方法を制御しない回答のボーナスポイント。 (つまり、クライアントAから知っている唯一の情報は、ファイルが既知のファイル名に書き込まれていることです。)

答え1

単一ファイルの場合は、SFTPを使用する代わりに、転送側でsshを介してファイルを使用またはパイプし、cat中間サーバーで使用することができ、そこのファイルにデータを送信し、もう一方の端から別のSSHリンクを介してコピーを送信できます。ファイルにデータを書き込みます。今はそれを持って遊ぶ時間がないので練習で必要な正確な桟橋を読者に任せます(申し訳ありません)。この方法は、2番目のターゲットがSSHを介してパブリックにアクセスできる場合にのみ機能し、クライアントシステムで説明している場合はそうでない可能性があります。pvtee

「実行して待つ」方法は少ないですが、おそらくより簡単なもう1つのアプローチは、rsyncサーバーとクライアントBの間で使用することです。この方法を初めて実行するとデータの部分コピーが得られますが、再実行するとより多くのデータが得られます(クライアント1->サーバー転送が完了した後の最後の実行)。これは、SFTP転送中にサーバーがデータを正しいファイル名に直接入力する場合にのみ機能します(時々データが一時ファイルに移動し、ファイルが完全に転送された後に名前を変更することがあります。これはアトミックですが、rsyncのアイデアは利用できません)。 C1-> S転送にscpの代わりにrsyncを使用することもできます(--inplace上記の問題を回避するためにそのオプションを使用する場合)。 rsyncを使用すると、C1->サーバー接続に問題が発生した場合にすべてを再送信する必要がない保護も提供されます。大規模な転送(rsync --inplace -a --progress <source> <dest>私はrsyncが利用可能なときに「トランスポート再開」動作にscp / sftpの代わりにscp / sftpを使用する傾向があります)。

上記をまとめるには、次のようにします。

rsync --inplace -a --progress <source> user@server:/<destination_file_or_folder>

client1 で以下を実行します。

rsync --inplace -a --progress user@server:/<destination_file_or_folder> <destination_on_cli2>

最初の転送が完了するまでclient2で繰り返します(その後、もう一度実行してすべてが得られたことを確認します)。rsync毎回全体を送信するのではなく、場所を更新するために必要な絶対最小値のみを送信するのは非常に上手です。妄想の場合は、そのオプションをrsyncコマンドに追加できます(大容量ファイルの場合はCPU時間が長くなりますが、必要ない場合はより多くのデータが--checksum送信されません)。--compress送信された形式は圧縮されません。

答え2

今は試せないので失敗する可能性が高いです。私の考えは次のとおりです。クライアントBのディレクトリにファイルをマウントします。たとえば、クライアントBのファイルシステムでは、/mnt/serverにsshfsを使用します。それから

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

答え3

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

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

それから

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

スループットを表示するには、pv コマンドを追加します。

答え4

もともとポスターから要求されたような解決策が必要な状況に直面しました。ある場所ではパソコンでホッケーの試合を録画していますが、別の場所ではテレビで見たいです。 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はファイルの終わりに達しません。次に、それをパイプビューア(pv)に接続し、そのファイルの一般的なサイズに基づいてファイルサイズを推定しました。必須ではありませんが、プログレスチャートを見ることをお勧めします。次にストリームをSSH接続にパイプします。 sshは-C圧縮(ネットワーク帯域幅を減らし、速度を上げるため)、-c arcfour,blowfish-cbc最も安価な暗号化(再び速度を上げるため)に接続します。これは-pターゲットが使用するファイアウォールポートです。そしてsshを使用し、最後にddコマンドを実行します。受信したファイルを再生成するための宛先です。この解決策がうまく機能すると言われてうれしいです。ファイルの作成とコピー中に遅延を最小限に抑えながら、ホッケーの試合を見ることができます。

関連情報