Ответы:
Вы можете попробовать следующий подход: вместо 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 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
scp -o ConnectTimeout 60
Позволяет указать время ожидания для соединения. Может помешать вашей связи от разрыва.
Да, если оба конца поддерживают sftp - после scp remoteuser@remotehost:/absolute/filename .
сбоев вы можете продолжить, sftp remoteuser@remotehost
а затем reget /absolute/filename
продолжить загрузку.