Комбинированная расшифровка и разархивация файла

Комбинированная расшифровка и разархивация файла

У меня есть зашифрованный файл типа file.zip.gpg.

Расшифровка выполняется с помощью gpg --output file.zip --decrypt file.zip.gpgи последующей распаковкой содержимого архива 7z(a) x file.zip.

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

Я пытался

gpg --decrypt file.zip.gpg | 7z x -si

но 7zвыходные данные появляются до того, gpgкак запрашивается парольная фраза: Extracting archive: ERROR: Can not open the file as archive.

решение1

Вы не отметили, но имя файла содержит .zip, поэтому я предполагаю, что после расшифровки это действительно zip-файл.

Видетьэтот ответ:

Формат файла ZIP включает каталог (индекс) в конце архива. Этот каталог указывает, где в архиве находится каждый файл, и таким образом обеспечивает быстрый, случайный доступ, без чтения всего архива.

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

Каталог в конце архива — не единственное место, где хранится метаинформация файла в архиве. Кроме того, отдельные записи также включают эту информацию в локальный заголовок файла в целях избыточности.

Хотя не каждый ZIP-декомпрессор будет использовать локальные заголовки файлов, когда индекс недоступен, интерфейсы tarи (также известные как и ) могут и будут делать это при чтении через канал, […]cpiolibarchivebsdtarbsdcpio

В моем Debian 9 решение с bsdtar(из libarchive-toolsпакета) работает:

gpg --decrypt file.zip.gpg | bsdtar -xvf-

Другие ответы предлагают другие решения. Некоторые из них используют временный файл в маскировке (например, =( … )в zsh), некоторые — нет (например busybox unzip -, но этот не работает у меня).


Если бы формат был 7z вместо zip, то проблема была бы аналогичной. Сравнитьэта тема:

Пытаюсь пропустить трубу7za

Я пытаюсь запустить 7zaконвейер в программе на C++. […]

То же самое произойдет, если я попытаюсь сделать это в командной строке.

7za e -an -si -so < filename.7z >/dev/null
ERROR:
Can not open the file as archive

E_NOTIMPL

Ответ Игоря Павлова (создателя 7-zip):

7-zip требует операцию "seek" для архивов 7z. Поэтому вы не можете использовать ее -siдля извлечения из архива 7z.

Это было датировано 2016-03-30. Мои тесты ижурнал измененийуказывают, что утверждение все еще актуально в 2019 году. Более того, bsdtarв моем Debian не может помочь, он выдаетError seeking in stdin . Я предполагаю, что формат 7zДействительнонужен файл с возможностью поиска.

Связанный контент