web-dev-qa-db-ja.com

部分的にコピーされたファイルでscpを再開する方法は?

Scp Shellコマンドを使用して、ファイルの巨大なフォルダーをコピーします。

しかし、ある時点で、実行中のコマンドを(Ctrl + Cまたはkillで)強制終了する必要がありました。

私の理解では、scpはファイルを順番にコピーするので、部分的にコピーされたファイルは1つだけです。

正常にコピーされたファイルを上書きせず、部分的にコピーされたファイルを適切に処理するために、同じscpコマンドを再開するにはどうすればよいですか?

追伸この種のことをrsyncで行えることは知っていますが、何らかの理由でscpの方が高速であり、代わりにそれを使用します。

70
Bohdan

rsyncよりもsshを使用する必要があります

rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path

キーオプションは-Pです。これは--partial --progressと同じです

-a(アーカイブモード用)や-z(圧縮を有効にするため)などの他のオプションも使用できます。

マニュアル: https://download.samba.org/pub/rsync/rsync.html

111
jordi

Rsyncの代替:

sftpをオプション-r(ディレクトリ全体を再帰的にコピー)およびsftpgetコマンドのオプション-aを使用して、既存のファイルの部分的な転送を再開します。

前提条件:sftp実装には、-aオプション付きのgetが既にあります。

例:

ディレクトリ/foo/barをリモートサーバーからローカルの現在のディレクトリにコピーします。ディレクトリbarはローカルの現在のディレクトリに作成されます。

echo "get -a /foo/bar" | sftp -r server
22
Cyrus

OpenSSH 6.3以降では、regetsftp command を使用できます。

getと同じ構文ですが、既存のローカルファイルの最後から転送を開始する点が異なります。

8
Martin Prikryl

別の可能性は、失速したときにすでに開始したscpを救おうとすることです。

ctrl + zをバックグラウンドにして停止し、受信サーバーにsshでログインしてログインし、終了します。さて、scpプロセスをfgし、「停止」から再開するのを見てください!

5
Puckfist

最初に正常に動作していた数秒後にrsyncが停止する場合、次のブルートフォースソリューションになりました。

cat run_me.sh
#!/bin/bash
while [ 1 ]
do
  rsync --partial --progress --rsh=ssh user@Host:/path/file.tgz file.tgz &
  TASK_PID=$!
  sleep 60
  kill $TASK_PID
  sleep 2
done

rsync-rshおよび-Pオプションを使用できます。 -Pは部分的なダウンロード用で、-rshは転送がssh procotol経由であることを示します。

完全なコマンドは次のようになります:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path

0
Bunny Rabbit