詳細は次のとおりです。
- 私はsftpを使用してクライアントAからサーバーに大容量ファイルをアップロードしています。
- また、SSHを介してサーバーからクライアントBにファイルをダウンロードする必要があります。
私が望むのは、クライアントAがまだアップロードしている間、サーバーからクライアントBへの転送を開始することです。
これを行うための最良の方法/ツールは何ですか?
修正する:
これまでの答えは面白いです。ぜひ読んでテストしてみましょう。クライアントAがファイルをアップロードする方法を制御しない回答のボーナスポイント。 (つまり、クライアントAから知っている唯一の情報は、ファイルが既知のファイル名に書き込まれていることです。)
ベストアンサー1
単一ファイルの場合は、SFTPを使用する代わりに、転送側でsshを介してファイルを使用またはパイプし、cat
中間サーバーで使用することができ、そこのファイルにデータを送信し、もう一方の端から別のSSHリンクを介してコピーを送信できます。ファイルにデータを書き込みます。今はそれを持って遊ぶ時間がないので練習で必要な正確な桟橋を読者に任せます(申し訳ありません)。この方法は、2番目のターゲットがSSHを介してパブリックにアクセスできる場合にのみ機能し、クライアントシステムで説明している場合はそうでない可能性があります。pv
tee
「実行して待つ」方法は少ないですが、おそらくより簡単なもう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
送信された形式は圧縮されません。