Есть ли способ возобновить прерванный scp файла?

12

Время от времени я загружаю очень большой файл через scp, и каждый раз, когда соединение обрывается и пересекает передачу, есть небольшая вероятность.

Есть ли способ возобновить это?

ГДж.
источник

Ответы:

9

Вы можете попробовать следующий подход: вместо scp используйте dd, чтобы пропустить загруженную часть и добавить остаток к файлу.

sofar=`ls -l ./destfile | awk '{print $5}'`
ssh rsys "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile

Возможная оптимизация: работа с большими блоками. Давайте оставим это как домашнее задание.

yrk
источник
Я еще не проверял это, но принимаю ответ ориентировочно, так как использование dd звучит как отличный подход к решению.
ГДж.
Я только что проверил, работает отлично, спасибо!
Коссак
@ Коссак, приятно слышать!
yrk
ddс небольшими размерами блоков может быть медленным (всего 350 кБ / с здесь). К счастью, scpпередачи, кажется, приходят в 1024-байтовые блоки. Если это так для файла (или же, путем усечения его к ближайшему 1024 байт блока), вы можете ускорить его , как это: ssh rsys "dd if=./srcfile bs=1024 skip=$sofar" >> ./destfile. (Обратите внимание, что $sofarтогда должно быть количество 1024-байтовых блоков, чтобы пропустить!)
tanius
2
Мне потребовалось некоторое время, чтобы понять, что rsysво второй строке это просто пример имени хоста, а не какой-то особый аргумент для ssh. Я предлагаю вам заменить его, user@hostчтобы избежать путаницы.
Ахмед Эссам
7

С scpнет.

Если оба конца имеют его, вы можете использовать rsync -LvzP remoteserver:path/to/file localfileдля передачи одного файла.

user1686
источник
Это сэкономило мне часы загрузки огромного файла, который был прерван. Спасибо.
phette23
3

Да, есть способы возобновления с точки прерывания, но это невозможно с помощью scp. sftp reget filenameделает то, что вам нужно Yarek и Grawity предоставили действительные решения, которые мне +1 для обоих, но для возобновления с точки прерывания мне нравится rsync. Представленные примеры команд предполагают, что вы извлекаете файл с удаленного сервера на локальную рабочую станцию ​​(загрузка). Пожалуйста, имейте в виду, что последние два параметра должны рассматриваться как source_file и target_file в этом порядке. Синтаксис имени файла зависит от того, является ли исходный или целевой файл локальным или удаленным. Если бы я отправлял (загружал) [текстовые] файлы, я бы переписал приведенные ниже примеры:

# От локального к удаленному
sofar = `ssh remote_system ls -l interrupted_file | awk '{print $ 5}' `;
dd if = source_file bs = 1 skip = $ sofar | ssh remote_system "cat >> ./interrupted_file"

И к решению rsync добавляю -e ssh. Вам следует подумать о том, нужно ли вам многословие, сжатие, сохранение владения, разрешения, метка времени, каталоги рекурсоров и т. Д. Проверьте справочные страницы и google относительно параметра -L. Возможно, вы захотите, чтобы символические ссылки оставались ссылками, а не ссылались на них.

rsync -P -e ssh local_source_file remoteserver:path/to/interrupted_target_file

Дэниэл Листон
источник
1

Есть другое решение (кроме указанных здесь rsyncили ddрешений), которое, как я удивляюсь, никто не упомянул: это reputкоманда sftp.

knocte
источник
0
scp -o ConnectTimeout 60

Позволяет указать время ожидания для соединения. Может помешать вашей связи от разрыва.

user1055604
источник
0

Да, если оба конца поддерживают sftp - после scp remoteuser@remotehost:/absolute/filename .сбоев вы можете продолжить, sftp remoteuser@remotehostа затем reget /absolute/filenameпродолжить загрузку.

Джейсон Дрейн
источник