问题的上下文是我试图将带有单引号的密码短语传递给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
我想知道我做错了什么。
答案 0 :(得分:0)
我终于解决了这个问题。
我现在可以确认openssl配置文件允许转义的单引号出现在 input_password 字段中。不仅如此,而且openssl使用的实际密码未按预期转义。最终用户永远不会知道密码是在配置文件中转义的。
我在脚本中使用sed工作时遇到了一些麻烦,因为根据我的理解,双引号会消耗反斜杠而不是单引号。另一方面,单引号不会消耗反斜杠,因此无法解释转义字符。这意味着我无法在单引号内转义单引号。
这让我找到了解决方案
cut -d: -f2 "$EMPLOYEE_CREDENTIALS_FILE"| sed -e "s|'|"'\\\'"'|g"
这类似于this stackoverflow question中的答案,但它对我的情况不起作用。
答案中还提到了需要3个反斜杠的原因:
通过在sed命令周围使用双引号,您可以删除 担心嵌入式单引号。你必须担心 逃脱,因为壳会吸收一层逃逸。