環境変数の予期しないタグが原因でcloud-initで構文エラーが発生します。

環境変数の予期しないタグが原因で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

間違い:

$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\"'

ベストアンサー1

この資料では二重引用符をエスケープする必要はありません。ユーザーが実行するように、シェルは変数を拡張し、実行されたシェルはそれをsu文字通り受け入れ、引用符-p \"gy75k9([0y6se2v^\"をバックスラッシュにエスケープし、引用符(なしでそのままにします。

\バックスラッシュがない場合は、パスワードに、$またはバックティックが含まれていない限り機能します"。または、一重引用符に変更してパスワードの一重引用符に注意してください。

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

バラより他のスクリプトの内容として使用するために変数をエスケープする一重引用符を含む任意の値の処理に関するものです。


suまたは、変数を展開してシェルを起動します。 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

おすすめ記事