【问题标题】:sed replacing single quotes with backslash single quote for openssl config filesed 用反斜杠单引号替换 openssl 配置文件的单引号
【发布时间】:2013-03-10 18:44:08
【问题描述】:

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

取自openssl configuration file manual

可以使用任何类型的引号来转义某些字符 或 \ 字符。通过使一行的最后一个字符成为 \ 一个值 字符串可以分布在多行中。此外序列 \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

我想知道我做错了什么。

【问题讨论】:

  • 问题是什么似乎很清楚。 “我在尝试将包含单引号的密码短语传递给 openssl 配置文件的 input_password 参数时遇到问题。”我想出了一个不起作用的解决方案。因此,答案应该要么更正命令以允许转义发生,要么提供另一种方法来处理其中包含单引号的密码短语。我不知道我是否可以更清楚。
  • 我“认为”,因为文档没有明确说明单引号是否可以转义:“可以使用任何类型的引号或 \ 字符来转义某些字符。通过使一行的最后一个字符a \a 值字符串可以分布在多行中。此外,还可以识别序列\n、\r、\b 和\t”取自openssl.org/docs/apps/config.html

标签: sed openssl


【解决方案1】:

我终于解决了这个问题。

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

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

这让我找到了解决方案

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

这与this stackoverflow question 中的答案相似,但不适用于我的情况。

需要3个反斜杠的原因也在答案中找到:

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

【讨论】:

    猜你喜欢
    • 2022-01-27
    • 2011-12-25
    • 2017-09-14
    • 2014-09-25
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多