У меня есть зашифрованный файл типа 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
и (также известные как и ) могут и будут делать это при чтении через канал, […]cpio
libarchive
bsdtar
bsdcpio
В моем 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Действительнонужен файл с возможностью поиска.