繁体   English   中英

如何避免Shell脚本Sed修改密码变量内容

[英]How to avoid Shell script Sed modifying password variable contents

当我想尝试下面的sed

sed -e 's,</Context>,<Resource name="ABC"  password="'"$DB_PASS"'"/>\n&,' -i /path

sed正在截断反斜杠。

例如

DB_PASS='1!2@3#4$5%6^7&8*9(0)[{]}\|'

O / p是

<Resource name="jdbc/KARDB" 
 password=""1!2@3#4$5%6^7</Context>8*9(0)[{]}|""/> </Context>

如果我的DB_PASS包含反斜杠,&,单引号双引号任何其他spl字符我不希望sed更改密码内容。 但要原样替换。

谢谢,Kusuma

您遇到的具体问题是您的密码包含& ,在s命令的替换部分中引用匹配的文本。

由于以下原因将shell变量精确地替换为sed代码通常不是一个好主意:sed无法区分代码和数据。 这是可能出错的更无害的事情之一; 想象一下如果有人输入了像rm -Rf /,e #这样的密码,GNU会怎么做。

用GNU awk直接替换(它必须是gawk,因为RT是GNU特定的)可能是

DB_PASS="$DB_PASS" gawk -v RS='</Context>' '{ printf $0; if(RT == RS) { print "<Resource name=\"jdbc/KARDB\" password=\"" ENVIRON["DB_PASS"] "\"/>" } printf RT }'

通常的-v dbpass="$DB_PASS"技巧在这里不起作用,因为你甚至不想解释转义序列,所以我们强行将DB_PASS添加到awk的环境中并从那里获取它。 如果你想要在适当的位置更改文件并且你有GNU awk 4.1.0或更高版本,尽管我通常使用cp file file~; awk ... file~ > file添加-i inplace到awk的选项中cp file file~; awk ... file~ > file cp file file~; awk ... file~ > file以便在出现问题时进行备份。

但是有一个问题:你如何处理"密码?可能做一些像dbpass = ENVIRON["DB_PASS"]; gsub(/"/, "&quot;", dbpass); 并在输出中使用dbpass 对于所有其他关键字符也是如此,例如<>

由于您似乎正在解析XML数据,因此最好使用基于XML的工具,以便在Context标记为空并写为<Context/>时不会遇到问题,并避免上述问题(这可能是一个相当大的)。 例如,使用xmlstarlet,您可以执行以下操作:

xmlstarlet ed -s '//Context' -t elem -n Resource -i '//Context/Resource[not(@name)]' -t attr -n name -v 'jdbc/KARDB' -i '//Context/Resource[@name="jdbc/KARDB"]' -t attr -n password -v "$DB_PASS"

这包括三个步骤:

-s '//Context' -t elem -n Resource

在每个Context节点下插入一个空的Resource子节点(如果只有一个,那就没问题;否则你可能想要更详细地指定它)

-i '//Context/Resource[not(@name)]' -t attr -n name -v 'jdbc/KARDB'

在每个没有名称的Context/Resource节点中插入一个属性name="jdbc/KARDB" (希望只有我们刚插入的那个),以及

-i '//Context/Resource[@name="jdbc/KARDB"]' -t attr -n password -v "$DB_PASS"

name属性值为jdbc/KARDBContext节点下的每个Resource节点中插入值为$DB_PASS (正确引用)的password属性(同样,这应该只是我们刚刚插入的节点)。 对于一次性插入整个节点的更完美的解决方案,您需要仔细研究xslt,但如果您对原始的sed方法感到满意,那么这种方法的缺点都不应该成为问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM