題
鑒于此單行字串:
PG_USER=postgres PG_PORT=1234 PG_PASS=icontain=and*symbols
將每個值分配給其指定變數以便我以后可以使用它的正確方法是什么?
語境
我正在決議 k8s 秘密的背景關系,CronJob以便我可以定期呼叫 Postgres 資料庫中的存盤程序。
為此,我計劃使用:
PG_OUTPUT_VALUE=$(PGPASSWORD=$PG_PASSWD psql -qtAX -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -c $PG_TR_CLEANUP_QUERY)
echo $PG_OUTPUT_VALUE
我目前正在嘗試修復的實際整個舵圖如下所示:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: {{ template "fullname" $ }}-tr-cleanup-cronjob
spec:
concurrencyPolicy: Forbid
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
volumes:
- name: postgres
secret:
secretName: {{ template "fullname" $ }}-postgres
containers:
- name: {{ template "fullname" $ }}-tr-cleanup-pod
image: postgres:12-alpine
imagePullPolicy: Always
env:
- name: PG_PROPS
valueFrom:
secretKeyRef:
name: {{ template "fullname" $ }}-postgres
key: postgres.properties
command:
- /bin/sh
- -c
- echo "props:" && echo $PG_PROPS && PG_USER=$(grep "^PG_USER=" | cut -d"=" -f2-) && echo $PG_USER && PG_TR_CLEANUP_QUERY="SELECT something FROM public.somewhere;" && echo $PG_TR_CLEANUP_QUERY && PG_OUTPUT_VALUE=$(PGPASSWORD=$PG_PASSWD psql -qtAX -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE -c $PG_TR_CLEANUP_QUERY) && echo PG_OUTPUT_VALUE
volumeMounts:
- name: postgres
mountPath: /etc/secrets/postgres
當前方法
如您所見,我目前正在使用:
PG_USER=$(grep "^PG_USER=" | cut -d"=" -f2-)
那是因為我最初認為秘密會在多行上輸出,但事實證明我錯了。將echo $PG_USER顯示一個空字串。
uj5u.com熱心網友回復:
bashdeclare命令在這里是合適的,并且比eval.
假設輸入包含潛在的惡意內容
line='PG_USER=postgres PG_PORT=1234 PG_PASS=icontain=and*symbols`ls`'
我假設沒有一個值包含空格。讓我們拆分那個字串
read -ra assignments <<< "$line"
現在,declare每一個
for assignment in "${assignments[@]}"; do declare "$assignment"; done
在我們檢查輸入的任何地方,我們都保留雙引號。
讓我們看看我們最終得到了什么:
$ declare -p PG_USER PG_PORT PG_PASS
declare -- PG_USER="postgres"
declare -- PG_PORT="1234"
declare -- PG_PASS="icontain=and*symbols\`ls\`"
uj5u.com熱心網友回復:
選項1
這個函式可以重用來單獨分配每個變數:
extract() {
echo "$INPUT" | grep -o "$1=.*" | cut -d" " -f1 | cut -d"=" -f2- ;
}
并使用它:
PG_USER=$(extract PG_USER)
PG_PORT=$(extract PG_PORT)
PG_PASS=$(extract PG_PASS)
選項 2
另一個具有安全問題的潛在解決方案是簡單地使用:
eval "$INPUT"
僅當您已驗證輸入時才應使用它。
背景關系完整的答案
因為我已經在問題中介紹了 k8s 背景關系,所以這里是插入該解決方案的答案。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: {{ template "fullname" $ }}-cronjob
spec:
concurrencyPolicy: Forbid
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
volumes:
- name: postgres
secret:
secretName: {{ template "fullname" $ }}-postgres
containers:
- name: {{ template "fullname" $ }}-cronjob-pod
image: postgres:12-alpine
imagePullPolicy: Always
env:
- name: PG_PROPS
valueFrom:
secretKeyRef:
name: {{ template "fullname" $ }}-postgres
key: postgres.properties
command:
- /bin/sh
- -c
- >-
extract() { echo "$PG_PROPS" | grep -o "$1=.*" | cut -d" " -f1 | cut -d"=" -f2- ; } &&
export PGHOST=$(extract PG_HOST) &&
export PGPORT=$(extract PG_PORT) &&
export PGDATABASE=$(extract PG_DATABASE) &&
export PGUSER=$(extract PG_USER) &&
PG_SCHEMA=$(extract PG_SCHEMA) &&
PG_QUERY="SELECT tenant_schema FROM $PG_SCHEMA.tenant_schema_mappings;" &&
PGPASSWORD=$(extract PG_PASSWD) psql --echo-all -c "$PG_QUERY"
volumeMounts:
- name: postgres
mountPath: /etc/secrets/postgres
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/373054.html
標籤:贝壳 Kubernetes kubernetes-cronjob
上一篇:windowscmd上“觸摸”的等價物是什么?[復制]
下一篇:將變數的全部內容傳遞給函式
