首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >环境变量中的意外令牌会在云init中抛出语法错误。

环境变量中的意外令牌会在云init中抛出语法错误。
EN

Unix & Linux用户
提问于 2021-05-11 22:49:30
回答 1查看 569关注 0票数 0

必须在下面的代码中更改What特定的语法,以防止环境变量包含意外令牌时引发的错误?

THE代码:

具体来说,在Azure中的RHEL 7 VM中运行的云init启动脚本需要切换到以非根用户的身份运行,同时运行一系列特定的命令,包括将环境变量的值传递给az login的下面一行:

代码语言:javascript
复制
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变量的随机密码的一部分。为了安全起见,我们将下面的密码更改为假密码,但为了说明错误,我们保留了(符号:

代码语言:javascript
复制
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\"'
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-05-11 23:17:32

你不需要逃避这里-医生的双引号。按照您的方式,外壳扩展了变量,su启动的shell看到了-p \"gy75k9([0y6se2v^\",反斜杠转义引号,(没有引用。

如果没有反斜杠,只要密码不包含\$"或反勾号,就可以工作。或者更改为单引号,这样您只需要关心密码中的单引号。

代码语言:javascript
复制
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扩展变量。

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/649295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档