【问题标题】:Escaping parentheses when sending GPG passphrase to a Perl script将 GPG 密码短语发送到 Perl 脚本时转义括号
【发布时间】:2016-05-06 11:48:49
【问题描述】:

我在使用从 cron 调用的 Perl 脚本时遇到了一些困难。

脚本的参数之一是 GPG 密码。稍后将其插入到发送到 shell 的字符串中。

此特定密码包含一个左括号,脚本失败并出现“意外标记附近的语法错误”错误。

这是该短语的冒犯部分:

m3(ÃÝ4úŤ;:q!

在脚本中使用该值之前,我尝试过单引号和双引号,但这没有效果。

当直接从 shell 调用 GPG 时,该短语可以正常工作,但当它被插入以下内容时却不能正常工作:

`gpg --passphrase $gpgpp --batch -o $gpgofile -d $file`;

其中 $gpgpp 是密码变量。

转义这个以及其他可能有问题的字符的正确方法是什么?

【问题讨论】:

  • 顺便说一句,反引号用于捕获 shell 命令的输出。如果您不想要该输出而只想运行该命令,则应改用system()
  • 永远不要在多用户机器上这样做——所有其他用户都可以看到你传递给进程的参数。请改用--passphrase-file--passphrase-fd
  • @JensErat 这不是多用户机器。不过,谢谢你的建议。

标签: perl shell gnupg


【解决方案1】:

\Q\E 转义序列用于转义它们之间的所有“特殊”字符。

`gpg --passphrase \Q$gpgpp\E --batch -o $gpgofile -d $file`;

当您有一个变量可能包含需要转义的字符时,应该这样做。

http://perldoc.perl.org/functions/quotemeta.html

【讨论】:

  • 标记为答案。谢谢 - 支持现有脚本,我的 Perl 经验有限 - 我不知道这些序列!
【解决方案2】:

用引号将变量括起来:

gpg --passphrase "$gpgpp" --batch -o "$gpgofile" -d "$file"

否则,shell 将尝试将变量的内容解释为表达式。

【讨论】:

    猜你喜欢
    • 2011-05-30
    • 2014-10-09
    • 2021-07-12
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多