当密码包含“!”时,在批处理模式下使用 gpg 解密文件?

当密码包含“!”时,在批处理模式下使用 gpg 解密文件?

我正在尝试使用 gpg 批处理模式解密脚本中的文件,但命令未执行,因为密码包含“!”

echo "m!pass"|gpg --batch --passphrase-fd 0 --decrypt-file plain.gpg
bash: !pass": event not found

或者

gpg --batch --passphrase "m!pass" -d plain.gpg 
bash: !pass": event not found

我猜 bash 正在将感叹号解释为对命令执行历史记录的引用。在 GPG 批处理模式下,哪种方法是正确的?

答案1

使用单引号而不是双引号:

$ echo "m!pass"
bash: !pass": event not found
$ echo 'm!pass'
m!pass

这在bash手册(强调):

单引号

将字符括在单引号 (''') 中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。

双引号

将字符括在双引号 ('"') 中会保留引号内所有字符的字面值,但 '$' 除外,' ’, ‘\’, and, when history expansion is enabled, ‘!’. The characters ‘$’ and ‘' 在双引号内保留其特殊含义(请参阅 Shell 扩展)。反斜杠保留其特殊含义仅当后跟以下字符之一时:'$'、'`'、'"'、'\' 或换行符。在双引号内,后跟这些字符之一的反斜杠将被删除。前面没有特殊含义的反斜杠字符保持不变。双引号可以在双引号内引用,方法是在双引号前面加上反斜杠。如果启用,将执行历史扩展,除非出现“!”出现在双引号中的内容使用反斜杠进行转义。'!' 前面的反斜杠没有被删除。

答案2

我首选的方法是禁用您从未听说过、从未想要过并且可能永远不会使用的愚蠢的历史扩展功能,即使您现在知道它:

$ echo "hello!"
bash: !": event not found

$ set +o histexpand

$ echo "hello!"
hello!

相关内容