环境变量中的意外标记会在 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分隔符之间包含的命令以指定的非 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\"'

答案1

您不需要在此处文档中转义双引号。按照你的方式,外壳扩展了变量,并且启动的外壳从字面上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

相关内容