Единственная команда Unix для корректной передачи большого файла?

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

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

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

3
задан 15.07.2015, 15:55

4 ответа

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

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

7
ответ дан 07.12.2019, 22:49
  • 1
    При использовании rsync затем, Вы используете rsync - если не будет никакого демона сервера, слушающего затем, он попробует вход в систему через SSH, запустить процесс rsync для действия временно как конец "сервера" и туннель rsync протокол поток SSH.Помните: при использовании rsync для перепроверки возможных поврежденных файлов против (по-видимому), известного - хорошая основная копия используйте --checksum опция вынудить это проверить содержание everyfile вместо того, чтобы брать ярлык принятия файлов с тем же size+timestamp в порядке. – David Spillett 10.10.2009, 14:01
  • 2
    Это очень верно, если он не NFS, или Samba смонтировал удаленный диск и указывает его, как будто это - локальный файл, в этом случае любое повреждение ниже NFS или Samba не будет обнаружено. Но он не указывал. – Randy Orrison 10.10.2009, 16:44
  • 3
    Там является NFS на локальном клиенте, но я копирую через rsync ssh удаленному клиенту (который не является смонтированным NFS). – user13798 10.10.2009, 21:22
  • 4
    , В этом случае пробует - контрольная сумма, как David Spillett предполагает. сценарий ~quack, который передает md5sum также, выглядит хорошим. главная причина – Randy Orrison 10.10.2009, 22:13

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

rsync -azcvPh file1 user@remotehost:/tmp/

-P статистика прогресса дисплея опции и поможет Вам понять, где/когда Ваша передача файлов повреждается.-h делает это "человекочитаемым" и сжатия-z.

6
ответ дан 07.12.2019, 22:49

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

3
ответ дан 07.12.2019, 22:49
  • 1
    May хочет проверить на сбой жестких дисков также... – retracile 10.10.2009, 20:53

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

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

$ 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 опции можно было настроить.

1
ответ дан 07.12.2019, 22:49

Теги

Похожие вопросы