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.


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


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

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


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'!


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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.