Одиночная команда unix для правильной передачи большого файла?

4714
user13798

Я пытаюсь передать большой (~ 3 ГБ) файл между двумя компьютерами Unix.

Я могу использовать scp или rsync, но иногда передача повреждена. (Я должен проверить вручную.) Я могу разбить файл на части и передать их, а затем контрольную сумму, а затем рекомбинировать, но это утомительно.

Существует ли одна команда для правильной передачи большого файла между двумя машинами Unix? Я хочу, чтобы он автоматически проверял контрольную сумму обеих копий и продолжал повторять передачу (или ее фрагменты) до тех пор, пока он не получит все байты через провод правильно.

3

4 ответа на вопрос

7
Randy Orrison

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

Используете ли вы сервер rsync на удаленном конце соединения? Если нет, то вы фактически не используете rsync для передачи файла, он просто использует какой-либо базовый метод транспорта, который вы используете, поэтому у вас не будет обнаружения ошибок.

Если вы используете rsync, то вы используете rsync - если сервер не прослушивает демон, он попытается войти в систему через SSH, запустит процесс rsync, который будет временно действовать как конец «сервера», и туннелирует протокол rsync потоком SSH. Помните: при использовании rsync для повторной проверки возможных поврежденных файлов на (предположительно) заведомо исправной мастер-копии используйте параметр `--checksum`, чтобы заставить его проверять содержимое каждого файла, вместо того, чтобы использовать ярлык для файлов одинакового размера + отметка времени в порядке. David Spillett 15 лет назад 2
Это очень верно, если только он не смонтировал удаленный диск с помощью NFS или SAMBA и не указал его как локальный файл, в этом случае любое повреждение ниже NFS или SAMBA не будет обнаружено. Но он не уточнил. Randy Orrison 15 лет назад 1
На локальном клиенте есть NFS, но я копирую через rsync ssh на удаленный клиент (который не смонтирован на NFS). user13798 15 лет назад 0
В этом случае попробуйте --checksum, как предполагает Дэвид Спиллетт. Скрипт квака, который передает md5sum, также выглядит хорошо. Randy Orrison 15 лет назад 0
6
randomx

Используйте опцию -c (контрольная сумма) в rsync.

rsync -azcvPh file1 user@remotehost:/tmp/ 

Опция -P отображает статистику прогресса и поможет вам понять, где / когда прервется передача файлов. -H делает его "читаемым человеком", а -z сжимается.

-P также подразумевает --partial, и это хорошо иметь в этом случае. amarillion 11 лет назад 0
3
knweiss

Вы используете лучшие команды, но ваш компьютер не работает. Я настоятельно рекомендую запустить memtest86 + на обеих машинах за ночь, чтобы проверить вашу оперативную память.

Может также проверить наличие сбоя жесткого диска ... retracile 15 лет назад 1
1
quack quixote

Вы всегда можете установить битрорент между хостами, но я не уверен, как это автоматизировать.

Я не делаю такого рода вещи часто, поэтому я бы не стал писать сценарии. Вместо этого я бы собрал большую строчку, чтобы сделать работу. Технически, это не одна команда, а все в одной строке. Это не сложно, если вы делаете это часто.

$ md5sum bigfile > bigfile.md5 ; export BIGFILE="notdone" ; while [ "$BIGFILE" eq "notdone" ] ; do rsync --checksum --partial bigfile* user@remotehost:path/to/put/it/in/ ; ssh user@remotehost "cd path/to/put/it/in/; md5sum -c < bigfile.md5" | grep -Ev 'OK$' | [ `wc -l` == "0" ] && BIGFILE="done" ; done 

Это делится на:

$ md5sum bigfile > bigfile.md5 ; \ # create our own checksum export BIGFILE="notdone" ; \ # set our check variable while [ "$BIGFILE" == "notdone" ]; do \ # recheck variable state after each pass rsync --checksum --partial bigfile* \ # call rsync to copy user@remotehost:path/to/put/it/in/ ; \ # and call ssh to check ssh user@remotehost \ # connect with ssh "cd path/to/put/it/in/; md5sum -c < bigfile.md5" \ # and run the check | grep -Ev 'OK$' \ # ignore good output | [ `wc -l` == "0" ] \ # if we didn't find one && BIGFILE="done" ; \ # set our get-out-of-jail card done \ # and we're done 

Вы должны настроить SSH для входа на ваш хост с ключом авторизации для запуска без взаимодействия. Если вы это сделаете, поместите туда эхо-оператор, чтобы сказать, где он находится.

Протестировано, но я ожидаю, что параметры rsync могут быть изменены.