
Иногда я скачиваю очень большой файл через scp, и каждый раз существует небольшая вероятность того, что соединение прервется и передача данных прервется на полпути.
Есть ли способ возобновить его?
решение1
Вы можете попробовать следующий подход: вместоscpиспользоватьддчтобы пропустить загруженную часть и добавить оставшуюся часть к файлу.
sofar=`ls -l ./destfile | awk '{print $5}'`
ssh user@host "dd if=./srcfile bs=1 skip=$sofar" >> ./destfile
Возможная оптимизация: работа с большими блоками. Оставим это как домашнее задание.
решение2
С scp
, нет.
Если он есть на обоих концах, вы можете использовать его rsync -LvzP remoteserver:path/to/file localfile
для передачи одного файла.
решение3
Да, есть способы возобновить работу с точки прерывания, но это невозможно с помощью scp. sftp reget filename
делает то, что вам нужно. Yarek и Grawity предоставили допустимые решения, которым я ставлю +1 обоим, но для возобновления работы с точки прерывания мне нравится rsync. Оба примера команд предполагают, что вы извлекаете файл с удаленного сервера на свою локальную рабочую станцию (загружаете). Пожалуйста, имейте в виду, что последние два параметра следует считать source_file и target_file в этом порядке. Синтаксис имени файла зависит от того, является ли исходный или целевой файл локальным или удаленным. Если бы я отправлял (загружал) [текстовые] файлы, я бы переписал приведенные примеры следующим образом:
#От локального к удаленному sofar=`ssh удаленная_система ls -l прерванный_файл | 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
решение4
Да, если оба конца поддерживают sftp - после scp remoteuser@remotehost:/absolute/filename .
сбоя вы можете возобновить загрузку, выполнив sftp remoteuser@remotehost
и затем , reget /absolute/filename
чтобы возобновить загрузку.