Полагаю, вы могли бы сделать это с любой программой загрузки, использующей именованный канал , но я предвижу проблемы, если какая-то часть загрузки пойдет не так, и вам придется возобновить загрузку: данные исчезли, и вы не можетеначать загрузку, даже если вы потеряли только 1 байт.Это также относится к стратегии read from stdin .
Моя стратегия будет следующей:
- Создание именованного канала с использованием
mkfifo
. - Запустить процесс шифрования, записывающий в этот именованный канал в фоновом режиме.Вскоре буфер канала будет заполнен, и процесс шифрования будет заблокирован при попытке записи данных в канал.Он должен разблокироваться, когда мы будем читать данные из канала позже.
- Считать определенный объем данных из именованного канала (скажем, 1 ГБ) и поместить его в файл.Для этого можно использовать утилиту
dd
. - Загрузить этот файл, хотя ftp делает это стандартным способом.Затем вы можете иметь дело с повторными попытками и сетевыми ошибками.После завершения загрузки удалите файл.
- Вернитесь к шагу 3, пока не получите EOF из канала.Это будет означать, что процесс шифрования завершен с записью в канал.
- На сервере добавьте файлы по порядку к пустому файлу, удалив файлы один за другим после его добавления.Использование
touch next_file; for f in ordered_list_of_files; do cat $f >> next_file; rm $f; done
или какого-либо другого варианта должно сделать это.
Конечно, вы можете подготовить следующий файл, пока загружаете предыдущий файл, чтобы использовать максимальный уровень параллелизма.Узким местом будет либо ваш алгоритм шифрования (ЦП), либо пропускная способность вашей сети, либо пропускная способность диска.
Этот метод приведет к потере 2 ГБ дискового пространства на стороне клиента (или меньше, или больше, в зависимости от размерафайлы) и 1 ГБ дискового пространства на стороне сервера.Но вы можете быть уверены, что вам не придется делать это снова, если ваша загрузка зависла в конце.
Если вы хотите быть уверены в двойном результате результата передачи, вы можете вычислить хэш своих файлов, показаписать их на диск на стороне клиента и удалять файл клиента только после проверки хеша на стороне сервера.Хеш может быть вычислен на стороне клиента одновременно с записью файла на диск с помощью dd ... | tee local_file | sha1sum
.На стороне сервера вам придется вычислять хеш перед выполнением cat, и избегать делать cat, если хеш плохой, поэтому я не могу понять, как это сделать, не читая файл дважды (один раз для хэша и один раздля кошки).