Command line 如何使用Rar或WinRAR创建密码以双引号开头的加密存档?

Command line 如何使用Rar或WinRAR创建密码以双引号开头的加密存档?,command-line,special-characters,rar,winrar,Command Line,Special Characters,Rar,Winrar,我试图创建一个命令行,通过Windows7中的命令行使用密码压缩为RAR文件。我已安装WinRAR 5.31 x64 以下命令适用于我: rar a -r -m0 -hp"!(/!$!#!#=)\%" C:\files1.rar" *.* 密码是!(/!$!!!=)\% 如果我想在密码中加双引号,例如在开头,我的问题就会出现: rar a -r -m0 -hp""!(/!$!#!#=)\%" C:\files1.rar" *.* 密码应该是“!(/!$!!!=)\% 这对我不起作用,我试着把

我试图创建一个命令行,通过Windows7中的命令行使用密码压缩为RAR文件。我已安装WinRAR 5.31 x64

以下命令适用于我:

rar a -r -m0 -hp"!(/!$!#!#=)\%" C:\files1.rar" *.*
密码是
!(/!$!!!=)\%

如果我想在密码中加双引号,例如在开头,我的问题就会出现:

rar a -r -m0 -hp""!(/!$!#!#=)\%" C:\files1.rar" *.*
密码应该是
“!(/!$!!!=)\%

这对我不起作用,我试着把
\
放在
之前,但这也不起作用


有谁能指导我通过它来找出密码中的这个特殊字符吗?

Windows命令解释器
cmd.exe
Rar.exe
本身决定了在解析命令行时如何解释命令行上指定的参数。包含空格或其中一个字符的参数字符串
&()[]{}^=;!'+,`~
必须用双引号括起来。这使得将双引号字符作为参数字符串的一部分传递给控制台应用程序非常困难,尤其是在参数字符串的开头

但是有一个解决方案可以解决这个非常罕见和非常特殊的问题,这个问题是由密码/密码短语引起的,它以一个直接的双引号字符开始,该字符通常标记参数字符串的开始/结束,所有字符之间的字符串都按字面解释

WinRAR控制台版本的手册是WinRAR的program files文件夹中的文本文件
Rar.txt
。在本手册中可以看到
Rar.exe
支持从环境变量
Rar
读取开关。通过使用此环境变量和对Windows命令行interpre的特殊解析ter在SET命令行上,可以从命令行创建一个RAR存档,密码以一个直接的双引号字符开头

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "RAR=-hp""!(/!$!#!#=)\%%""
"%ProgramFiles%\WinRAR\Rar.exe" a -r -m0 -x"%~f0" "%USERPROFILE%\Desktop\files1.rar" *.*
endlocal
开关
-hp
是从环境变量
RAR
读取的,此外,还可以从手册中解释的RAR命令行上直接指定的其他开关读取

环境变量
RAR
是使用语法
set“variable=value”
定义的,如上的答案所详细解释

带有空格或以下字符之一的密码/密码短语
&()[]{}^=;!“+,`~
需要在Windows命令行上用双引号括起来。因此,
Rar.exe
从传递的密码/密码短语中删除第一个和最后一个双引号(如果在开始和/或结束处有一个双引号)。因此无法使用
定义密码!(/!$!!!=)\%
。必须使用
“”,用两个额外的双引号定义密码!(/!$!!!\=)\%“
让真正使用的密码以直接双引号字符开头

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "RAR=-hp""!(/!$!#!#=)\%%""
"%ProgramFiles%\WinRAR\Rar.exe" a -r -m0 -x"%~f0" "%USERPROFILE%\Desktop\files1.rar" *.*
endlocal
在批处理文件中,
%
标记环境变量引用的开始/结束,除非它用另一个
%
转义

最后,命令行
设置“RAR=-hp”!(/!$!!!\=)\%%”“
使用开关
-hp
将环境变量
RAR
定义为传递字符串
“!(/!$!!\=)\%
to
RAR.exe
作为加密时使用的密码

RAR存档
files1.RAR
由该代码在用户桌面上创建,因为目录
C:
的根目录通常是写保护的

注意:RarWinRAR解释
*.
*.
不同,与在手册中解释的Windows内核函数相同。Rar在使用
*.
时,仅将文件名中包含点的文件添加到Rar存档文件中。因此,您可以最好只使用
*
作为通配符


开关
-x“%~f0“
如果批处理文件在执行时存储在当前目录中,则禁止将批处理文件也添加到RAR归档文件中。在命令提示窗口中运行
call/?
,了解
%~f0
–参数0的全名的说明,该参数表示具有扩展名和完整路径的批处理文件名。

关于Mofi的回答:

特别是对于从命令行使用winrar/rar的Linux用户来说,
rar
可以有效地接受“密钥文件”,这可以克服在密码中使用引号的需要

Rar记录的最大密码长度为127个字符/字节。(对我来说)不清楚哪些字符是密码空间的一部分,但至少base64编码字符串可以工作。但是,当前使用基于密码的密钥派生函数,该函数基于PBKDF2,使用HMAC-SHA256哈希函数,其块大小为512位。根据,比哈希函数的块大小长的密码首先预哈希为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
-管道将从内核的(非阻塞)随机数源设备读取48个(伪)随机字节,将其转换为64个字符的密码,告诉
rar
使用该密码导出256位(AES256)加密密钥(RAR5格式),同时将密码存储在文件“/tmp/pwd”中

通过从文件中读回密码,可以再次访问存档,例如列出,例如:

rar l -p"$(cat /tmp/pwd)" archive.rar
密码文件可以单独存储,也可以与存档一起安全存储,在后一种情况下(当然),可以使用自己的公钥进行加密,例如使用
gpg
,以便将存档密码锁定在