sed用反斜杠单引号替换openssl配置文件的单引号
问题描述:
问题的上下文是,我试图将单引号的密码传递给openssl配置文件的input_password参数。sed用反斜杠单引号替换openssl配置文件的单引号
从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字段中出现转义单引号。不仅如此,openssl使用的实际密码按预期未被转义。最终用户永远不会知道密码已在配置文件中转义。
我在脚本内部做了sed工作时遇到了一些麻烦,因为从我理解的双引号中消耗了反斜杠而不是单引号。另一方面,单引号不会消耗反斜杠,因为它不能解释转义字符。这意味着我无法在单引号内跳过单引号。
这花了我一个解决方案
cut -d: -f2 "$EMPLOYEE_CREDENTIALS_FILE"| sed -e "s|'|"'\\\'"'|g"
这类似于this stackoverflow question找到了答案,但它不适合我的情况下工作。
的原因是需要3个反斜杠的答案也被找到:
利用周围sed命令双引号,则删除需要 担心嵌入单引号。你不必担心 逃跑,因为shell会吸收一个级别的逃脱。
这似乎很清楚问题是什么。 “我有一个问题,试图将带有单引号的密码传递给openssl配置文件的input_password参数。”我想出了一个不起作用的解决方案。因此,答案应该纠正命令以允许转义发生,或者提供另一种方法来处理带有单引号的密码短语。我不知道我能否更清楚。 – 2013-03-11 01:56:06
我“认为”,因为文档没有明确说明单引号是否可以转义: “可以通过使用任何引号或\字符来转义某些字符。通过将一行的最后一个字符\值字符串可以分布在多行中。另外,序列\ n,\ r,\ b和\ t被识别为“从http://www.openssl.org/docs/apps/config.html获取”。 – 2013-03-11 02:22:17