sed用openssl配置文件的反斜杠单引号替换单引号

时间:2013-03-10 18:44:08

标签: sed openssl

问题的上下文是我试图将带有单引号的密码短语传递给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

我想知道我做错了什么。

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。

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

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

这让我找到了解决方案

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

这类似于this stackoverflow question中的答案,但它对我的情况不起作用。

答案中还提到了需要3个反斜杠的原因:

  

通过在sed命令周围使用双引号,您可以删除   担心嵌入式单引号。你必须担心   逃脱,因为壳会吸收一层逃逸。