在Unix系统中解压有密码保护的zip文件

79
我需要创建一个shell脚本,其中我将解压一个有密码保护的zip文件。 我知道密码,并需要自动化解压过程。
如何使用Unix shell脚本实现这一点?

2
如果您要在脚本中硬编码密码,我假设这意味着(1)您控制.zip文件的创建,(2)由于您需要对其进行脚本化,因此该文件将在一台计算机上创建并解压缩多次。如果是这样,您是否考虑过不使用文件级加密,而是使用安全传输(例如SSH)通过网络使用私钥/公钥的方式,以避免输入密码? - Fred
7个回答

104
unzip -P your-password zipfile.zip

man unzip

-P password

使用 password 解密已加密的 zip 文件条目(如果有)。这是不安全的!许多多用户操作系统提供了一种方法,使任何用户都可以查看其他用户的当前命令行;即使在独立系统上,也总存在着隔壁偷窥的威胁。将明文密码作为自动化脚本中的一部分存储在命令行中甚至更糟。尽可能使用非回显式交互提示输入密码。(并且在安全真正重要的情况下,使用强加密,如PGP,而不是标准zip文件工具提供的相对较弱的加密。)


3
我也遇到了同样的问题,但是你的命令没有起作用。7z x archive.zip -ppassword 命令起作用了。 - Kapil
2
need PK compat. v5.1 (can do v4.6) - ACV
我刚刚发现这取决于加密方式是否可行。因为这对于AES-256加密无效。但它适用于ZipCrypto(似乎是默认的)。 - Monocito
谢谢 - 我很惊讶没有相应的双破折号命令,比如:"--password"。 - edwardsmarkf
如果您需要一次提取数百个受密码保护的文件,这里是我刚刚添加的一个答案,介绍如何使用findxargsunar -p并行化和加速操作 - Gabriel Staples

39
在Ubuntu中,我需要使用以下命令安装7zip(7z)压缩工具:sudo apt-get install p7zip-full
sudo apt-get install p7zip-full

然后,您可以使用Ubuntu默认的压缩文件管理器解压受密码保护的zip文件。


1
通常我更喜欢使用CLI,但是7-Zip支持比默认解压缩更高的加密版本。双击也很有用。 - Luke
1
完美运行! - Patrik Beck

23

我在使用unzip时遇到了问题,显示需要PK兼容性v5.1(可以使用v4.6)。 我安装了p7zip,然后使用以下命令进行解压:

unzip命令出现“need PK compat. v5.1 (can do v4.6)”错误时,可尝试安装p7zip并使用以下命令解压:

7z x archive.zip -ppassword

12

解压多个受密码保护的文件时,此命令不起作用

unzip -P PASSWORD *.zip

为了使其起作用,您需要将*.zip放在引号中,因为无论何时使用通配符(*),shell本身都会扩展它并将结果传递给程序。这是因为与UNIX中的大多数程序不同,unzip不能一次接受多个文件。

在此处阅读更多信息:https://chrisjean.com/unzip-multiple-files-from-linux-command-line/

因此,要解压多个受保护的文件,请使用以下命令:

unzip -P PASSWORD  '*.zip'    

它返回“错误:必须使用-P选项提供解密密码”。我做错了什么吗? - Cameron Hudson

4
请按照以下说明操作,我已经通过以下步骤解决了同样的问题。
  1. sudo apt install p7zip-full
  2. 7z x example.zip
  3. 它会要求您输入压缩文件的密码,请提供密码并让进程完成

访问以下网址获取更多详细信息:详情请点击此处


2

在多次撞墙后,我来发表一下我的看法。

如果你收到的密码包含特殊字符,比如 $ ; \ 等等,你的 shell 终端可能会将其解释为 shell 特殊符号的一部分,而不是你想要的密码字符串。

解决方法很简单,将密码用单引号括起来!

7z x [yourzipfile] -P'your$pass;word!'

希望这能帮助你节省时间,当突然间似乎你的 zip/unzip 加密密码无法使用时!


0
解压或提取一个受密码保护的文件
"unar"(解压缩)效果很好。所以,你可以使用"unar"或"unzip",像这样。请注意,"unar"使用小写的"-p",而"unzip"使用大写的"-P":
# (my preference) Unzip myfile.zip into dir myfile/
unar -p my_password path/to/myfile.zip

# Unzip myfile.zip into the current directory
unzip -P my_password path/to/myfile.zip
# Unzip myfile.zip into dir myfile/
unzip -P my_password -d myfile path/to/myfile.zip

我在这里了解到使用-d some/directory选项来解压缩zip文件:如何将zip文件提取到特定文件夹中?

我更喜欢使用unar而不是unzip,因为unar会自动将内容解压缩到与文件同名的文件夹中,这非常方便,可以防止我将提取的文件放错位置。

通过findxargsunar并行解压缩多个密码保护的文件

如果您一次要解压缩数百甚至数千个文件,可以使用xargs并行操作,每个CPU核心生成一个进程(如nproc所示),直到所有文件完成。这样可以大大提高速度!下面是具体方法:

# Unzip many password-protected files at once, assuming they all have the same
# password

# Generally what I use:
# - Note: `-maxdepth 1` causes this to only unzip *top-level* .zip files within
#   your current directory
time find . -maxdepth 1 -type f -iname "*.zip" -print0 | xargs -0 -I{} -n 1 -P $(nproc) unar -p my_password -f {}

# Or, remove `-maxdepth 1` to unzip *all* .zip files, recursively, which are
# found within your current directory or lower.
time find . -type f -iname "*.zip" -print0 | xargs -0 -I{} -n 1 -P $(nproc) unar -p my_password -f {}

第一个命令在1.084秒内为我解压了93个相似的大小约为2 MB的文件。每个文件耗时1.084秒/93个文件= 0.012秒。使用nproc命令显示我有20个核心。
如果我以单线程/单进程运行,串行而不是并行,将-P $(nproc)更改为-P 1,则得到以下命令(time find . -type f -iname "*.zip" -print0 | xargs -0 -I{} -n 1 -P $(nproc) unar -p my_password -f {}),这需要9.246秒。每个文件耗时9.246秒/93个文件= 0.099秒,即慢了8.25倍。

只是为了好玩,我还运行了一个串行解压命令:time unzip -o -P my_password '*.zip'(请注意,-o 是危险的,意味着"覆盖"现有文件),作为速度比较。在我的93个文件上花费了8.196秒,也比上面的多进程unar命令慢得多,后者只需1.084秒,更糟糕的是,它创建了一个庞大且无法使用的混乱的文件堆叠在同一个目录中。

因此,请使用上面的并行形式,其中我将find管道传递给xargsunar

参考资料

  1. 我在这里的主要答案中学到了unzip -P my_password path/to/myfile.zip
  2. 我的回答在如何同时解压多个文件中,我首次介绍了使用find管道传递给xargsunar进行并行提取操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接