我正在尝试创建一个命令行,通过Windows 7中的命令行使用密码压缩为RAR文件。我已经安装了WinRAR 5.31 x64。
以下命令对我有用:
rar a -r -m0 -hp"!(/!$!#!#=)%" C:files1.rar" *.*
密码为!(/!$!#!#=)%
。
如果我想在密码中"
双引号,例如在开头,就会出现问题:
rar a -r -m0 -hp""!(/!$!#!#=)%" C:files1.rar" *.*
密码应"!(/!$!#!#=)%
。
这对我不起作用,我尝试在"
之前放,但这也不起作用。
谁能指导我完成它以找出我的密码中的这个特殊字符?
进一步回答 Mofi:
特别是对于从命令行使用 winrar/rar 的 Linux 用户,可能值得意识到rar
有效地接受"密钥文件",这可能会克服将引号作为密码一部分的需要。
Rar 记录的最大密码长度为 127 个字符/字节。(对我来说)不清楚哪些字符是密码空间的一部分,但至少 base64 编码的字符串可以工作。但是,rar
目前使用基于 PBKDF2 的基于密码的密钥派生函数,使用 HMAC-SHA256 哈希函数,其块大小为 512 位。根据 PBKDF2,长度超过哈希函数块大小的密码首先预哈希为 256 位的摘要,然后将摘要用作密码(而不是原始密码)。为避免这种情况,您选择的存档密码不应超过 512 位或 64 个字符。
在 base64 编码的字符串中,每个字符表示 6 位数据;因此,64 个字符的密码相当于 384 个随机位,这些位可能来自 48 个随机字节。
rar a -hp"$(dd if=/dev/urandom bs=48 count=1 | base64 -w0 | tee /tmp/pwd)" archive
上面的dd
-pipe 将从内核的(非阻塞)随机数源设备读取 48(伪)随机字节,将它们转换为 64 个字符的密码,告诉rar
使用该密码派生 256 位 (AES256) 加密密钥(RAR5 格式),同时将密码存储在文件"/tmp/pwd"中。
可以通过从文件中读回密码再次访问存档,例如列出
,例如:rar l -p"$(cat /tmp/pwd)" archive.rar
密码文件可以安全地单独存储或与存档一起存储,在后一种情况下(当然)在加密后,例如使用您自己的公钥gpg
,以便将存档密码锁定在您的私钥/密钥短语下。所有这些都是为了方便地充分利用rar
的密码/密钥空间。
我注意到我没有深入研究unrar
的公开源代码;以上只是基于一般文档。另外,我不知道上述是否可以在Windows下工作。
Windows 命令解释器cmd.exe
和Rar.exe
本身确定在分析命令行时如何解释命令行上指定的参数。包含空格或其中一个字符的参数字符串&()[]{}^=;!'+,`~<|>
必须用双引号括起来。这使得将双引号字符作为参数字符串的一部分传递给控制台应用程序变得非常困难,尤其是在参数字符串的开头。
但是,对于这个非常不常见且非常具体的问题,有一个解决方案,该问题是由以直双引号字符开头的密码/密码短语引起的,该字符通常标记所有字符之间的参数字符串的开始/结束,按字面解释。
WinRAR控制台版本的手册是WinRAR的程序文件文件夹中Rar.txt
的文本文件。可以在本手册中读到Rar.exe
支持从环境变量RAR
读取开关。通过使用此环境变量和在SET命令行上对Windows命令行解释器进行特殊解析,可以从命令行创建RAR存档,其密码以单个直双引号字符开头。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "RAR=-hp""!(/!$!#!#=)%%""
"%ProgramFiles%WinRARRar.exe" a -r -m0 -x"%~f0" "%USERPROFILE%Desktopfiles1.rar" *.*
endlocal
交换机-hp
是从环境变量RAR
读取的,以及手动说明直接在RAR命令行上指定的其他交换机。
环境变量RAR
是使用语法set "variable=value"
定义的,如 答案 为什么在命令行上使用"set var = text"后没有带有"echo %var%"的字符串输出?
在 Windows 命令行上,带有空格或这些字符之一的密码/密码短语&()[]{}^=;!'+,`~<|>
需要用双引号括起来。因此,Rar.exe
从传递的密码/密码短语中删除第一个和最后一个双引号(如果在开头和/或结尾处有一个)。因此,无法使用"!(/!$!#!#=)%
定义密码。密码必须使用两个额外的双引号定义,以使用""!(/!$!#!#=)%"
让真正使用的密码以直双引号字符开头。
在批处理文件中%
标记环境变量引用的开始/结束,除非它被转义,再用一个%
。因此,最后命令行set "RAR=-hp""!(/!$!#!#=)%%""
定义了环境变量RAR
,-hp
将字符串"!(/!$!#!#=)%
传递给Rar.exe
作为密码以用于加密。
RAR 存档files1.rar
由此代码在用户桌面上创建,作为目录C:
的根目录通常受到写保护。
注意:Rar和WinRAR解释*.*
与解释它们相同的 Windows 内核函数相比,手册中也解释了*
。Rar仅将文件名中包含点的文件添加到 RAR 存档文件中,使用*.*
.因此,您最好只使用*
作为通配符。
如果在执行批处理文件时存储在当前目录中,则开关-x"%~f0"
可防止将批处理文件也添加到 RAR 存档文件中。在命令提示符窗口中运行call /?
的解释%~f0
– 参数 0 的全名,表示具有扩展名和完整路径的批处理文件名。