10

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

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

5 ответов5

9

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

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

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

6

С scp нет.

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

3

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

#From local to remote
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

0
scp -o ConnectTimeout 60

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .