必须在下面的代码中更改What特定的语法,以防止环境变量包含意外令牌时引发的错误?
THE代码:
具体来说,在Azure中的RHEL 7 VM中运行的云init启动脚本需要切换到以非根用户的身份运行,同时运行一系列特定的命令,包括将环境变量的值传递给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请注意,在云init脚本中使用了su - azureuser << EOF...EOF,以确保EOF分隔符之间包含的命令作为指定的非根用户执行。
THE错误:
引发的错误似乎是由插入符号引起的,该符号是填充$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\"'发布于 2021-05-11 23:17:32
你不需要逃避这里-医生的双引号。按照您的方式,外壳扩展了变量,su启动的shell看到了-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环境变量。这一次,需要双引号,以允许内部shell扩展变量。
export AZ_CLIENT AZ_PASS AZ_TENANT
su -p - azureuser << 'EOF'
...
az login --service-principal -u "$AZ_CLIENT" -p "$AZ_PASS" --tenant "$AZ_TENANT"
EOFhttps://unix.stackexchange.com/questions/649295
复制相似问题