Загрузить вывод программы напрямую в удаленный файл по ftp - PullRequest
1 голос
/ 16 августа 2011

У меня есть какая-то программа, которая генерирует много данных, чтобы быть конкретными архивами архивирования.Я хочу загрузить результат на удаленный FTP-сервер.

Файлы довольно большие (около 60 ГБ), поэтому я не хочу тратить место на жестком диске для tmp dir и времени.

Возможно ли это?Я проверил утилиту ncftput, но нет возможности читать со стандартного ввода.

Ответы [ 4 ]

3 голосов
/ 16 августа 2011

curl можно загрузить при чтении со стандартного ввода:

-T, --upload-file

[...]

Используйте имя файла "-" (один штрих), чтобы использовать стандартный ввод вместо заданного файл. Альтернативно, имя файла "." (один период) может быть указано вместо "-" использовать стандартный ввод в неблокирующем режиме, чтобы чтение вывода с сервера во время загрузки stdin.

[...]

1 голос
/ 16 августа 2011

Полагаю, вы могли бы сделать это с любой программой загрузки, использующей именованный канал , но я предвижу проблемы, если какая-то часть загрузки пойдет не так, и вам придется возобновить загрузку: данные исчезли, и вы не можетеначать загрузку, даже если вы потеряли только 1 байт.Это также относится к стратегии read from stdin .

Моя стратегия будет следующей:

  1. Создание именованного канала с использованием mkfifo.
  2. Запустить процесс шифрования, записывающий в этот именованный канал в фоновом режиме.Вскоре буфер канала будет заполнен, и процесс шифрования будет заблокирован при попытке записи данных в канал.Он должен разблокироваться, когда мы будем читать данные из канала позже.
  3. Считать определенный объем данных из именованного канала (скажем, 1 ГБ) и поместить его в файл.Для этого можно использовать утилиту dd.
  4. Загрузить этот файл, хотя ftp делает это стандартным способом.Затем вы можете иметь дело с повторными попытками и сетевыми ошибками.После завершения загрузки удалите файл.
  5. Вернитесь к шагу 3, пока не получите EOF из канала.Это будет означать, что процесс шифрования завершен с записью в канал.
  6. На сервере добавьте файлы по порядку к пустому файлу, удалив файлы один за другим после его добавления.Использование 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, если хеш плохой, поэтому я не могу понять, как это сделать, не читая файл дважды (один раз для хэша и один раздля кошки).

0 голосов
/ 23 сентября 2015

Это пример загрузки на сайт ftp по curl

wget -O- http://www.example.com/test.zip | curl -T - ftp://user:password@ftp.example.com:2021/upload/test.zip
0 голосов
/ 16 августа 2011

Вы можете записать в удаленный файл, используя ssh:

program | ssh -l userid host 'cd /some/remote/directory && cat - > filename'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...