使用oc在OpenShift中创建Secret时,分号后的值无法被识别
解决OpenShift中创建包含分号的Secret值的问题
这个问题的核心是Shell会把分号;解析为命令分隔符——你原来的命令里,;databaseName=somedatabasename会被Shell当成一个独立的命令去执行,而不是作为JDBC URL的一部分,所以Secret里的url值会被截断到分号之前。
这里有几种可靠的解决方法:
方法1:用单引号包裹完整值
单引号会让Shell完全忽略内部的所有特殊字符(包括分号、空格、变量引用等),是最稳妥的方式:
oc create secret generic mysecret \ --from-literal=jdbc.mmi.driverClassName=something \ --from-literal=jdbc.mmi.userid=something \ --from-literal=jdbc.mmi.password=something \ --from-literal=jdbc.mmi.url='something;databaseName=somedatabasename'
方法2:用双引号包裹值
如果你的值里包含单引号,可以改用双引号。双引号内的分号不会被Shell解析为命令分隔符,不过要注意如果值里有$、`这类字符,需要用反斜杠\转义:
oc create secret generic mysecret \ --from-literal=jdbc.mmi.driverClassName=something \ --from-literal=jdbc.mmi.userid=something \ --from-literal=jdbc.mmi.password=something \ --from-literal=jdbc.mmi.url="something;databaseName=somedatabasename"
方法3:转义分号
给分号前加上反斜杠\,告诉Shell这是一个普通字符,不是命令分隔符:
oc create secret generic mysecret \ --from-literal=jdbc.mmi.driverClassName=something \ --from-literal=jdbc.mmi.userid=something \ --from-literal=jdbc.mmi.password=something \ --from-literal=jdbc.mmi.url=something\;databaseName=somedatabasename
验证结果
创建完成后,你可以用以下命令验证Secret里的URL是否完整:
oc get secret mysecret -o jsonpath='{.data.jdbc\.mmi\.url}' | base64 -d
执行后应该输出完整的something;databaseName=somedatabasename。
内容的提问来源于stack exchange,提问作者Ishant Gaurav
相关产品推荐
相关产品推荐

