我正在尝试编写一个bash函数,以便在一个简短的命令中获取和解码kubernetes秘密的数据。我的想法是把kgsecd -n <namespace> <secret-name> <secret-data>
映射到kubectl get secret -n <namespace> <secret-name> -o "jsonpath={.data.<secret-data>}" | base64 -d
。我已经将其编码如下:
kgsecd() {
secretData="${@: -1}"
kubectlParams=(${@:1:-1})
echo "kubectl get secret ${kubectlParams} -o "jsonpath={.data.$secretData}" | base64 -d"
kubectl get secret "${kubectlParams}" -o "jsonpath={.data.$secretData}" | base64 -d;
}
然而,我正在努力使它工作,因为当我调用它时,它在终端中不显示任何输出(除了echo
句子),但是如果我复制&粘贴并执行echo句子的输出,它就会像预期的那样工作。让我用一个例子来说明我的意思:
$> kgsecd -n my-ns my-secret secret-data
kubectl get secret -n my-ns my-secret -o "jsonpath={.data.secret-data}" | base64 -d
$>
但是当我执行kubectl get secret -n my-ns my-secret -o "jsonpath={.data.secret-data}" | base64 -d
时,我得到了预期的结果。
如果您正在使用bash
,请尝试以下操作,只更改kubectlParams
的分配方式。这里,kubectlParams
将第一个参数赋值给倒数第二个参数($#-1
)。
另外,如果加引号的话,"${kubectlParams}"
将被认为是一个命令。例如:-n my-ns my-secret
将被视为单个字符串。它将被视为单个字符串,该字符串是kubectl
的参数。kubectl可以理解-n
,my-ns
,my-secret
,但不能理解-n my-ns mysecret
。
kgsecd() {
secretData="${@: -1}"
kubectlParams=${@:1:$#-1}
echo "kubectl get secret ${kubectlParams} -o "jsonpath={.data.$secretData}" | base64 -d"
kubectl get secret ${kubectlParams} -o "jsonpath={.data.$secretData}" | base64 -d
}
执行输出:
#test secret created:
kubectl create secret generic my-secret -n my-ns --from-literal=secret-data=helloooooo
#function output
kgsecd -n my-ns my-secret secret-data
kubectl get secret -n my-ns my-secret -o "jsonpath={.data.secret-data}" | base64 -d
helloooooo
#manual命令执行输出:
kubectl get secret -n my-ns my-secret -o "jsonpath={.data.secret-data}" | base64 -d
helloooooo
zsh
解决方案(见OP注释):
kgsecd() { kubectl get secret ${@:1:-1} -o "jsonpath={.data.${@: -1}}" | base64 -d }
除了前面的答案之外,这实际上是正确的,这里是符合zsh的"长版本"。函数:
kgsecd() {
secretData=${@: -1}
kubectlParams=${@:1:-1}
kubectl get secret ${=kubectlParams} -o "jsonpath={.data.$secretData}" | base64 -d
}
的主要差异,使其zsh-compliant:
kubectlParams=${@:1:-1}
使用:-1}
代替:$#-1}
来获取params数组倒数第二个元素之前的项。kubectl get secret ${=kubectlParams} ...
注意${=kubectlParams}
中的等号。这是因为zsh不像bash,在变量替换时不拆分数组项,所以如果你想要这种行为,你必须添加等号。