Bash

環境變數中的意外令牌在 cloud-init 中引發語法錯誤

  • May 11, 2021

為了防止在環境變數包含意外標記時引發錯誤,必須在下面的程式碼中更改哪些特定語法?

編碼:

具體來說,在 Azure 的 RHEL 7 VM 中執行的 cloud-init 啟動腳本需要切換為以非 root 使用者身份執行,同時執行一小段特定命令,包括將環境變數的值傳遞到的以下行az login

su - azureuser << EOF
echo "User from whoami is: "
whoami
echo "About to login to az.  "
az login --service-principal -u \"$AZ_CLIENT\" -p \"$AZ_PASS\" --tenant \"$AZ_TENANT\"
EOF

請注意,su - azureuser << EOF...EOF在 cloud-init 腳本中使用 是為了確保包含在EOF分隔符之間的命令以指定的非 root 使用者身份執行。

錯誤:

引發的錯誤似乎是由作為填充$AZ_PASS變數的隨機密碼的一部分的括號符號引起的。為了安全起見,我們將下面的密碼更改為假密碼,但我們下面保留了(符號來說明錯誤:

azure-arm: User from whoami is:
azure-arm: azureuser
azure-arm: About to login to az.
azure-arm: -bash: line 4: syntax error near unexpected token `('
azure-arm: -bash: line 4: `az login --service-principal -u \"client-id-long-string\" -p \"gy75k9([0y6se2v^\" --tenant \"long-tenant-id-string\"'

您不需要在 here-doc 中轉義雙引號。你有它的方式,外殼擴展變數,外殼從字面上看,反斜杠轉義引號,並且不加su引號。-p \"gy75k9([0y6se2v^\"``(

如果沒有反斜杠,只要密碼不包含 、 或反引號,它就應該\可以工作$"或者改為單引號,這樣你只需要關心密碼中的單引號。

su - azureuser << EOF
...
az login --service-principal -u '$AZ_CLIENT' -p '$AZ_PASS' --tenant '$AZ_TENANT'
EOF

有關處理任意值(包括單引號)的資訊,請參閱轉義變數以用作另一個腳本的內容。


或者,通過su展開變數來啟動 shell。您需要引用 here-doc 分隔符(或 here-doc$中的所有符號),並用於su -p保留過去的環境變數su。而這一次,需要雙引號,以允許內殼擴展變數。

export AZ_CLIENT AZ_PASS AZ_TENANT
su -p - azureuser << 'EOF'
...
az login --service-principal -u "$AZ_CLIENT" -p "$AZ_PASS" --tenant "$AZ_TENANT"
EOF

引用自:https://unix.stackexchange.com/questions/649295