为了防止环境变量包含意外标记时引发错误,必须在下面的代码中更改哪些特定语法?
代码:
具体来说,在 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