Нужно ли проверять наличие файловых повреждений после выполнения scp?

17

Я рекурсивно перенес много файлов и папок с scpпомощью команды:

scp -rp /source/folder myremoteusername@122.10.12.123:/destination/folder

После завершения передачи мне нужно проверить, все ли файлы были переданы без каких-либо повреждений или scpпозаботились об этом (т.е. отображает ли какое-либо сообщение об ошибке, если какой-либо файл передан неправильно)?

Франк Дернонкур
источник
Если вы не получите ненулевой статус выхода scpи сопроводительное сообщение об ошибке в stderr , он скопирует все правильно и полностью.
roaima
немного д-р на мой пост: используйте, rsyncесли можете. Он копирует проверки для каждого файла после завершения транзакции, поэтому рекомендуется использовать его, чтобы быть немного более безопасным.
Полемон

Ответы:

24

scpпроверяет, что он скопировал все данные, отправленные другой стороной. Целостность передачи гарантируется протоколом криптографического канала. Таким образом, вам не нужно проверять целостность после передачи. Это было бы избыточно, и очень маловероятно, что вы обнаружите какую-либо аппаратную ошибку, поскольку сравниваемые данные, вероятно, будут считываться из кеша. Периодическая проверка данных может быть полезной, но проверка сразу после передачи бессмысленна.

Однако вы должны убедиться, что scpэто не говорит о том, что что-то пошло не так. Должно быть сообщение об ошибке, но надежный индикатор - scpвозвращает ненулевой код выхода, если что-то пошло не так.

Точнее, вы знаете, что файл был передан правильно, если scpвозвращает 0 (т. Е. Код состояния успеха). Проверка того, что статус выхода равен 0 , необходима, когда вы все равно запускаете какую-либо команду. Если scpвозвращается статус ошибки, или если он был убит сигналом, или если он никогда не умирает, потому что система падает или теряет питание во время работы, то у вас нет никаких гарантий. В частности, поскольку scpфайл копируется непосредственно в его окончательное имя, это означает, что в случае сбоя системы вы можете получить неполный файл. Скопированная часть гарантированно будет правильной, но файл может быть обрезан.

Для большей надежности используйте rsync вместо scp. Если не указано иное, rsync записывает во временный файл и перемещает его на место после его завершения. Таким образом, если rsync возвращает код успеха, вы знаете, что файл присутствует и правильная полная копия; если rsync не вернул код ошибки, файл не будет представлен (если только не существовала более старая версия файла, в этом случае более старая версия не будет изменена).

Жиль "ТАК - прекрати быть злым"
источник
3

У меня никогда не было проблем с коррупцией после того, как я scpчто-то сделал, но если вы беспокоитесь об этом, вы всегда можете запустить md5sum <filename>обе системы, чтобы убедиться, что они одинаковы.

Дэвид Кинг
источник
3

Согласно предложению @ david-king, это md5основанное решение для проверки целостности файлов после передачи. Выполните следующую команду сразу после cdИНГ /source/folderна локальной машине , и сразу же после cdИНГ /destination/folderна удаленном хосте: find . -type f -print0 | xargs -0 -I {} md5sum {} | md5sum. Полученный хэш должен быть идентичен после успешной передачи.

Обновить: Согласно этому ответу на аналогичный вопрос о ServerFault , scpне гарантирует целостность файла(Пожалуйста, проверьте этот ответ @Gilles для деталей). Альтернативу проверке файловых хэшей после rsyncпередачи можно использовать для передачи файлов и проверки их кода возврата.

Обновление 2: Следующее только проверяет, совпадают ли файлы и их соответствующие размеры после передачи:find . -type f -print0 | xargs -0 -I {} stat --printf="%n %s\n" {} | sort | md5sum

Мани М
источник
2
Если УПП возвращает 0, то целостность будет гарантирована. Кроме того, если scp не возвращает 0, то проблема не в общем повреждении, а именно в усечении; достаточно проверить размер файла (если только не была более старая версия целевого файла: если scp был прерван очень рано, тогда более старая версия все еще могла присутствовать). Проверка контрольных сумм здесь - пустая трата времени.
Жиль "ТАК - перестань быть злым"
Справедливо. Я обновил свой ответ.
Мани М
Вы не исправили фундаментальный недостаток. Проверка scpкода возврата достаточно, а проверка хэшей бесполезна.
Жиль "ТАК - перестань быть злым"
1
Даже если scpвозвращается 0, это не гарантирует, что файловая система ничего не испортила, поэтому проверка хешей по-прежнему полезна для проверки целостности конфиденциальных данных, если кто-то решит использовать их scpповторно rsync.
Мани М