0

问题的上下文是我试图将其中包含单引号的密码短语传递给 openssl 配置文件的 input_password 参数。

取自openssl 配置文件手册

可以使用任何类型的引号或 \ 字符来转义某些字符。通过使一行的最后一个字符为 \,一个值字符串可以分布在多行中。此外,还可以识别序列 \n、\r、\b 和 \t

我假设可以转义单引号。问题是我很难用 sed 生成转义的单引号。

有了这个,我的意思是,如果从脚本或命令行运行,以下表达式不会产生相同的结果。执行以下命令:

cut -d: -f2 "$EMPLOYEE_CREDENTIALS_FILE"| sed -e "s|'|\\\'|g"

其中 "$EMPLOYEE_CREDENTIALS_FILE" 是一个格式如下的文件

username:password

当我直接在 bash 中运行此命令时,它会产生我假设 openssl.conf 允许的输出:

tentacle caravan sovereignty appraisal sass\'s

当我在脚本中运行它时,它只会产生正常的未转义密码:

tentacle caravan sovereignty appraisal sass's

我想知道我做错了什么。

4

1 回答 1

0

我终于解决了这个问题。

我现在可以确认 openssl 配置文件允许转义单引号出现在input_password字段中。不仅如此,openssl 使用的实际密码也没有按预期转义。最终用户永远不会知道密码在配置文件中被转义。

我在使 sed 在脚本中工作时遇到了一些麻烦,因为据我所知,双引号会消耗反斜杠而不是单引号。另一方面,单引号不消耗反斜杠,因此无法解释转义字符。这意味着我无法在单引号内转义单引号。

这让我找到了解决方案

 cut -d: -f2 "$EMPLOYEE_CREDENTIALS_FILE"| sed -e "s|'|"'\\\'"'|g" 

这类似于在这个 stackoverflow 问题中找到的答案,但它不适用于我的情况。

答案中还可以找到需要 3 个反斜杠的原因:

通过在 sed 命令周围使用双引号,您无需担心嵌入的单引号。然后你必须担心逃逸,因为外壳会吸收一级逃逸。

于 2013-03-12T13:36:51.817 回答