Как возобновить scp с частично скопированными файлами? [закрыто]

104

Я использую команду оболочки scp для копирования огромной папки с файлами.

Но в какой-то момент мне пришлось убить запущенную команду (Ctrl + C или kill).

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

Как можно возобновить ту же команду scp, чтобы не перезаписывать успешно скопированные файлы и правильно обрабатывать частично скопированные файлы?

PS Я знаю, что могу делать такие вещи в rsync, но по какой-то причине scp для меня быстрее, и я использую его вместо этого.

Богдан
источник
4
Я подозреваю, что rsync работает медленнее, потому что он тратит дополнительное время на выполнение действий, позволяющих перезапустить передачу. Вы можете просто использовать rsync для завершения частичной передачи.
Кейт Томпсон
2
Если вы хотите быть умным, вы всегда можете попробовать ddс правильной skipпеременной и передать по конвейеру ssh:)
Марк Нанберг
1
Это не по теме SO. Он принадлежит SuperUser, и его действительно там спрашивали .
Дэн Даскалеску
rsync по умолчанию использует ssh, Typically, rsync is configured to use ssh by defaultтак что ... он должен быть примерно таким же быстрым (хотя сначала выполняется список каталогов, что может привести к более медленному запуску)
rogerdpack

Ответы:

193

Вы должны использовать rsyncболееssh

rsync -P -e ssh remoteuser@remotehost:/remote/path /local/path

Ключевой вариант -Pтакой же, как--partial --progress

По умолчанию rsync удаляет любой частично переданный файл, если передача прерывается. В некоторых случаях желательно сохранять частично переданные файлы. Использование параметра --partial указывает rsync сохранить частичный файл, что должно значительно ускорить последующую передачу остальной части файла.

Также можно использовать другие параметры, такие как -a(для режима архива) и -z(для включения сжатия).

Руководство: https://download.samba.org/pub/rsync/rsync.html

Джорди
источник
50
Просто хотел отметить, что rsync прекрасно возобновит пакетное копирование, запущенное с помощью scp.
Крейг Андерсон
7
Вы получите «каталог пропуска». ошибка, если вы также не укажете -r. Источник: lucasb.eyer.be/snips/rsync-skipping-directory.html
Артур Чайка,
4
У меня сработало, но я также добавил --append .... rsync -P --append -e ssh remoteuser @ remotehost: / remote / path / local / path
cnd
1
@CraigAnderson, это важный момент, который был упущен. Ответ звучит так, как будто он предполагает, что загрузка должна была начаться с rsync.
Willa
1
Варианты, приведенные в ответе, у меня не сработали, но вот такой:rsync -P -rsh remoteuser@remotehost:/remote/path /local/path
Кролик-кролик
29

Альтернатива rsync:

Использование sftpс опцией -r(рекурсивно скопировать целые каталоги) и опцию -aиз sftp«S getкоманды„возобновить частичную передачу существующих файлов.“

Предпосылка: в вашей sftpреализации уже есть опция getwith -a.

Пример:

Скопируйте каталог /foo/barс удаленного сервера в ваш локальный текущий каталог. Каталог barбудет создан в вашем локальном текущем каталоге.

echo "get -a /foo/bar" | sftp -r user@remote_server
Сайрус
источник
5
Ваше решение отличное, потому что мой сервер не позволяет вход в систему по ssh, поэтому rsync не работает. Мне нужно было загрузить вместо загрузки, поэтому вот моя команда:echo "put -a foo/bar" | sftp -r server:/foo
Карлос Рафаэль Рамирес,
2
Это кажется очень жизнеспособным вариантом для возобновления частично загруженных файлов, потому что rsync не очень удобен для ssh (с портами, отличными от значений по умолчанию).
codezombie
13

Начиная с OpenSSH 6.3, вы можете использовать regetкоманду в sftp.

Он имеет тот же синтаксис get, что и у него, за исключением того, что он начинает передачу с конца существующего локального файла.

echo "reget /file/path" | sftp -r user@server_name

Тот же эффект имеет -aпереключение на getкоманду или глобальный -aпереключатель командной строки sftp .

Мартин Прикрыл
источник
5

Другая возможность - попытаться спасти уже запущенный scp, когда он зависает.

ctrl + z в фоновый режим и остановите его, затем перейдите по ssh на принимающий сервер и войдите в систему, затем выйдите. Теперь запустите процесс scp и посмотрите, как он возобновляется из состояния "остановлен"!

Puckfist
источник
Работал у меня на Mac OS X. Спасибо, что опубликовал это, сегодня мне спасло бекон!
Бен Хичкок
Убейте эту сеть, чтобы увидеть, возродится ли она :)
rogerdpack
2

Когда rsync также останавливается через пару секунд при первоначальной работе, я получил следующее решение грубой силы для запуска и остановки повторного запуска загрузки каждые 60 секунд:

cat run_me.sh
#!/bin/bash
while [ 1 ]
do
  rsync --partial --progress --rsh=ssh user@host:/path/file.tgz file.tgz &
  TASK_PID=$!
  sleep 60
  kill $TASK_PID
  sleep 2
done
Ремигиуш Богушевич
источник
1

Вы можете использовать опции -rshи . предназначен для частичной загрузки и указывает на то, что передача завершена через ssh procotol.-Prsync-P-rsh

Полная команда будет такой: rsync -P -rsh remoteuser@remotehost:/remote/path /local/path

Кролик кролик
источник
То же, что и ответ Джорди?
rogerdpack
-4

Вчера у меня была такая же проблема, при передаче огромного дампа sql через scp, мне повезло с wget --continue the_url

Это сообщение в блоге довольно хорошо объясняет http://www.cyberciti.biz/tips/wget-resume-broken-download.html в основном:

wget --continue url
Арно Бушо
источник
Лучшей практикой считается копирование соответствующих частей из URL-адреса в ответ, если сайт не работает.
Ryre
Я пытаюсь загрузить, поэтому мне не нужен wget.
Рольф