Bash
環境變數中的意外令牌在 cloud-init 中引發語法錯誤
為了防止在環境變數包含意外標記時引發錯誤,必須在下面的程式碼中更改哪些特定語法?
編碼:
具體來說,在 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