在将文本加载到 Kubernetes secret 时,使用“>>”写入文件与在字符串中使用换行符“\n”有什么区别?
What is the difference of writing to files using ">>" vs using linefeed character "\n" in a string when loading text to Kubernetes secret?
我观察到 kubectl
在使用 --from-literal
选项时会插入一个额外的 \
来换行字符。从文件加载“相同”内容时,它按预期工作。显然,一定有区别,因为标准输出看起来不同,但我不明白为什么。
echo "api_key" >> .tmp
echo "api_value" >> .tmp
cat -e .tmp
kubectl delete secrets api-env
kubectl create secret generic api-env --from-file=.api=.tmp
rm .tmp
kubectl get secret api-env -o json | jq '.data | map_values(@base64d)'
#prints:
#api_key$
#api_value$
#secret "api-env" deleted
#secret/api-env created
#{
# ".api": "api_key\napi_value\n"
#}
上面的命令在每一行创建一个换行符。 cat -e
演示文件中有两个换行符,每个都在末尾。
使用字符串执行相同操作会导致 \n
被转义。
api="api_key\napi_value\n"
echo $api
kubectl delete secrets api-env
kubectl create secret generic api-env --from-literal=.api=$api
kubectl get secret api-env -o json | jq '.data | map_values(@base64d)'
#prints:
#api_key\napi_value\n
#secret "api-env" deleted
#secret/api-env created
#{
# ".api": "api_key\napi_value\n"
#}
echo
命令显示提供给变量的字符串,但是在将其加载到 kubernetes 之后,\n
被转义并且内容被视为单行。
这很重要,因为在我使用 kubectl
的几个实例中,我不允许写入本地文件系统。
这里发生了什么以及如何阻止 kubernetes 转义 \n
字符?
环境:
- zsh 5.8 (x86_64-apple-darwin21.0)
- 达尔文内核版本 21.4.0: root:xnu-8020.101.4~15/RELEASE_X86_64 x86_64
- kubectl 客户端:"v1.20.10"
- kubectl 服务器:“v1.23.3”
- minikube 版本:v1.25.2
当您使用 echo $api
时,echo
本身会更改内容:在 POSIX-compliant shell 启用 XSI 扩展(而 zsh 未启用 POSIX-compliant 一般来说,它 确实 实现了这个方面),\n
被替换为文字换行符。
不会发生在--from-literal=.api=$api
;在那里,你的 \n
仍然是 two-character 序列,首先是反斜杠,然后是 n
.
鉴于您使用的 shell 支持使用 $'\n'
作为直接表示换行文字的方式,请考虑 --from-literal=.api="api_key"$'\n'"api_value"
我观察到 kubectl
在使用 --from-literal
选项时会插入一个额外的 \
来换行字符。从文件加载“相同”内容时,它按预期工作。显然,一定有区别,因为标准输出看起来不同,但我不明白为什么。
echo "api_key" >> .tmp
echo "api_value" >> .tmp
cat -e .tmp
kubectl delete secrets api-env
kubectl create secret generic api-env --from-file=.api=.tmp
rm .tmp
kubectl get secret api-env -o json | jq '.data | map_values(@base64d)'
#prints:
#api_key$
#api_value$
#secret "api-env" deleted
#secret/api-env created
#{
# ".api": "api_key\napi_value\n"
#}
上面的命令在每一行创建一个换行符。 cat -e
演示文件中有两个换行符,每个都在末尾。
使用字符串执行相同操作会导致 \n
被转义。
api="api_key\napi_value\n"
echo $api
kubectl delete secrets api-env
kubectl create secret generic api-env --from-literal=.api=$api
kubectl get secret api-env -o json | jq '.data | map_values(@base64d)'
#prints:
#api_key\napi_value\n
#secret "api-env" deleted
#secret/api-env created
#{
# ".api": "api_key\napi_value\n"
#}
echo
命令显示提供给变量的字符串,但是在将其加载到 kubernetes 之后,\n
被转义并且内容被视为单行。
这很重要,因为在我使用 kubectl
的几个实例中,我不允许写入本地文件系统。
这里发生了什么以及如何阻止 kubernetes 转义 \n
字符?
环境:
- zsh 5.8 (x86_64-apple-darwin21.0)
- 达尔文内核版本 21.4.0: root:xnu-8020.101.4~15/RELEASE_X86_64 x86_64
- kubectl 客户端:"v1.20.10"
- kubectl 服务器:“v1.23.3”
- minikube 版本:v1.25.2
当您使用 echo $api
时,echo
本身会更改内容:在 POSIX-compliant shell 启用 XSI 扩展(而 zsh 未启用 POSIX-compliant 一般来说,它 确实 实现了这个方面),\n
被替换为文字换行符。
不会发生在--from-literal=.api=$api
;在那里,你的 \n
仍然是 two-character 序列,首先是反斜杠,然后是 n
.
鉴于您使用的 shell 支持使用 $'\n'
作为直接表示换行文字的方式,请考虑 --from-literal=.api="api_key"$'\n'"api_value"