Відповіді:
Ви можете спробувати таке схвалення: замість scp використовуйте dd, щоб пропустити завантажену частину та додати решту до файлу.
sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile
Можлива оптимізація: робота з великими блоками. Залишимо це як домашнє завдання.
dd
з невеликими блоковими розмірами може бути повільним (тут всього 350 кБ / с). На щастя, scp
передачі здаються в 1024 байтових блоках. Якщо це так для файлу (або ж, шляхом усічення його до найближчого 1024 байт блоку), ви можете прискорити його , як це: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile
. (Зверніть увагу, що $sofar
тоді для пропуску має бути кількість 1024 байтових блоків!)
rsys
у другому рядку є лише приклад імені хоста, а не якийсь спеціальний аргумент ssh
. Я пропоную вам замінити його, user@host
щоб уникнути плутанини.
Так, є способи відновлення з точки перерви, але це неможливо за допомогою scp. sftp reget filename
робить те, що потрібно. Yarek та Grawity запропонували правильні рішення, які я поставив +1 обом, але для відновлення з точки перерви мені подобається rsync. Наведені приклади команд припускають, що ви завантажуєте файл з віддаленого сервера на локальну робочу станцію (завантажуєте). Майте на увазі, що останніми двома параметрами слід вважати source_file та target_file у цьому порядку. Синтаксис імені файлу змінюється залежно від того, є вихідний або цільовий файл локальним чи віддаленим. Якщо я надсилаю (завантажую) [текстові] файли, я б переписав приклади, наведені як:
# Від локального до віддаленого sofar = `ssh remote_system ls -l interrupted_file | awk '{print $ 5}' `; dd, якщо = source_file bs = 1 пропустити = $ sofar | ssh remote_system "кішка >> ./interrupt_file"
І до рішення rsync я додаю -e ssh
. Ви повинні врахувати, чи потрібні багатослів’я, стиснення, збереження права власності, дозволів, часової позначки, повторних каталогів тощо. Перевірте основні сторінки та google стосовно параметра -L. Можливо, ви хочете, щоб символьні посилання залишалися як посилання замість посилання на них.
rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file
scp -o ConnectTimeout 60
Дозволяє вказати час очікування з'єднання. Може запобігти розриву вашого зв’язку.
Так, якщо обидва кінці підтримують sftp - після scp remoteuser@remotehost:/absolute/filename .
невдачі ви можете відновити роботу, sftp remoteuser@remotehost
а потім reget /absolute/filename
відновити завантаження.