Bagaimana cara melanjutkan scp dengan file yang sebagian disalin? [Tutup]

99

Saya menggunakan perintah scp shell untuk menyalin folder besar file.

Tetapi pada beberapa titik waktu saya harus mematikan perintah yang sedang berjalan (dengan Ctrl + C atau membunuh).

Untuk pemahaman saya scp file yang disalin secara berurutan, jadi seharusnya hanya ada satu file yang disalin sebagian.

Bagaimana perintah scp yang sama dapat dilanjutkan untuk tidak menimpa file yang berhasil disalin dan menangani file yang disalin sebagian?

PS Saya tahu saya bisa melakukan hal semacam ini di rsync, tetapi scp lebih cepat untuk saya karena alasan tertentu dan saya menggunakannya sebagai gantinya.

Bohdan
sumber
4
Saya menduga rsync lebih lambat karena ia menghabiskan waktu ekstra untuk melakukan hal-hal yang memungkinkan Anda memulai ulang transfer. Anda mungkin mempertimbangkan untuk menggunakan rsync untuk menyelesaikan transfer sebagian.
Keith Thompson
2
Jika Anda ingin menjadi pintar, Anda selalu dapat mencoba dddengan skipvariabel yang tepat , dan pipa ke ssh:)
Mark Nunberg
1
Ini di luar topik untuk SO. Itu milik SuperUser, dan memang telah ditanyakan di sana .
Dan Dascalescu
rsync menggunakan ssh secara default di bawah sampul Typically, rsync is configured to use ssh by defaultjadi ... seharusnya secepatnya (meskipun ia melakukan daftar direktori terlebih dahulu, yang mungkin memberikan awal yang lebih lambat)
rogerdpack

Jawaban:

188

Anda harus menggunakan rsynclebihssh

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

Opsi kuncinya adalah -P, yang sama dengan--partial --progress

Secara default, rsync akan menghapus file yang ditransfer sebagian jika transfer terputus. Dalam beberapa situasi, lebih diinginkan untuk menyimpan file yang ditransfer sebagian. Menggunakan opsi --pihak memberitahu rsync untuk menyimpan sebagian file yang seharusnya membuat transfer selanjutnya dari file lainnya lebih cepat.

Opsi lain, seperti -a(untuk mode arsip), dan -z(untuk mengaktifkan kompresi) juga dapat digunakan.

Manual: https://download.samba.org/pub/rsync/rsync.html

jordi
sumber
44
Hanya ingin mencatat bahwa rsync akan melanjutkan salinan batch yang dimulai dengan scp.
Craig Anderson
6
Anda akan mendapatkan "direktori skipping". kesalahan, kecuali Anda juga menentukan -r. Sumber: lucasb.eyer.be/snips/rsync-skipping-directory.html
Artur Czajka
4
Berhasil untuk saya, tetapi saya menambahkan --tambahkan juga .... rsync -P --append -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd
1
@CraigAnderson itulah poin penting yang telah ditinggalkan. Jawabannya terdengar seperti menyarankan unduhan harus dimulai dengan rsync untuk memulai.
Willa
1
Opsi yang diberikan dalam jawaban tidak berhasil untuk saya, tetapi ini berhasil:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Kelinci Kelinci
27

Alternatif untuk rsync:

Gunakan sftpdengan opsi -r(rekursif menyalin seluruh direktori) dan pilihan -adari sftp's getperintah 'melanjutkan transfer parsial dari file yang ada.'

Prasyarat:sftp Penerapan Anda sudah memiliki opsi getwith -a.

Contoh:

Salin direktori /foo/bardari server jauh ke direktori lokal Anda saat ini. Direktori barakan dibuat di direktori lokal Anda saat ini.

echo "get -a /foo/bar" | sftp -r user@remote_server
Cyrus
sumber
4
Solusi Anda bagus karena server saya tidak mengizinkan login di ssh, jadi rsync tidak berfungsi. Saya perlu mengunggah alih-alih mengunduh jadi inilah perintah saya:echo "put -a foo/bar" | sftp -r server:/foo
Carlos Rafael Ramirez
1
Ini tampaknya merupakan opsi yang lebih layak untuk melanjutkan file yang sebagian diunduh, karena rsync tampaknya tidak terlalu ramah ssh (dengan port non-default).
codezombie
12

Sejak OpenSSH 6.3, Anda dapat menggunakan regetperintah di sftp.

Ini memiliki sintaks yang sama dengan get, kecuali bahwa ia memulai transfer dari akhir file lokal yang ada.

echo "reget /file/path" | sftp -r user@server_name

Efek yang sama telah -aberalih ke getperintah atau saklar baris perintah global -a`sftp .

Martin Prikryl
sumber
5

Kemungkinan lain adalah mencoba menyelamatkan scp yang sudah Anda mulai saat macet.

ctrl + z ke latar belakang dan hentikan, lalu ssh ke server penerima dan login, lalu keluar. Sekarang fg proses scp dan lihat resume dari 'terhenti'!

Puckfist
sumber
Bekerja untuk saya di Mac OS X. Terima kasih telah memposting ini, ini menghemat daging saya hari ini!
Ben Hitchcock
Tendang jaringan itu untuk melihat apakah ia hidup kembali :)
rogerdpack
1

Anda dapat menggunakan opsi -rshdan . untuk diunduh sebagian dan menunjukkan transfer sudah berakhir ssh procotol.-Prsync-P-rsh

Perintah lengkapnya adalah: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path

Kelinci
sumber
Sama dengan jawaban jordi?
rogerdpack
1

Ketika rsync berhenti juga setelah beberapa detik ketika awalnya berjalan dengan baik, saya berakhir dengan solusi brute force berikut untuk memulai dan menghentikan memulai ulang unduhan setiap 60-an:

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
remigiusz boguszewicz
sumber
-4

Saya mendapat masalah yang sama kemarin, mentransfer sampah sql besar melalui scp, saya beruntung wget --continue the_url

Posting blog itu menjelaskannya dengan cukup baik http://www.cyberciti.biz/tips/wget-resume-broken-download.html pada dasarnya:

wget --continue url
Arnaud Bouchot
sumber
Ini dianggap praktik terbaik untuk menyalin bagian yang relevan dari url ke dalam jawaban jika situs tidak aktif.
Ryre
Saya mencoba mengupload, jadi jangan khawatir.
Rolf