You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行azcli命令的Bash脚本身份认证失败,如何解决?

问题原因及解决办法

核心原因

  1. 交互式认证未完成:手动在终端执行az login时,你可以通过浏览器或输入凭据完成交互式认证,但脚本运行时默认是非交互式环境,az login无法弹出浏览器或接收输入,导致认证流程没走完,后续命令自然失败。
  2. 子shell上下文隔离:用bash vault.sh运行脚本时,会启动独立的子shell,脚本内az login产生的认证上下文仅存在于该子shell中;若login未成功完成,后续命令无法读取有效认证信息就会失败。而手动执行是在当前shell会话,认证上下文直接生效。
  3. 环境变量差异:脚本运行时的PATH或其他环境变量可能与终端不一致,导致调用的az CLI不是同一版本/路径,无法读取手动登录时保存的认证信息。

解决办法

方法一:用服务主体实现非交互式认证(推荐用于自动化脚本)

这是脚本自动化场景的标准方案,无需手动交互:

  1. 先在终端创建服务主体并分配密钥库权限:
# 创建服务主体,记录输出中的appId、password、tenantId
az ad sp create-for-rbac -n "kv-access-sp" --role "Key Vault Secrets User" --scopes /subscriptions/<订阅ID>/resourceGroups/<资源组>/providers/Microsoft.KeyVault/vaults/myKeyVault2020
  1. 修改脚本,替换为服务主体登录逻辑:
# 替换为你的服务主体信息
SP_APP_ID="你的appId"
SP_PASSWORD="你的password"
SP_TENANT_ID="你的tenantId"

az login --service-principal -u $SP_APP_ID -p $SP_PASSWORD --tenant $SP_TENANT_ID
Source_Kv_Name="myKeyVault2020"
SECRETS+=($(az keyvault secret list --vault-name $Source_Kv_Name --query "[].id" -o tsv))

注意:不要把明文密码硬编码在脚本里,建议用环境变量传递,比如先执行export SP_PASSWORD="你的密码"再运行脚本。

方法二:让脚本继承当前shell的认证上下文(仅适合临时测试)

如果只是临时运行脚本,不想用服务主体,可以用source命令让脚本在当前shell执行,直接复用你之前手动登录的认证信息:

source vault.sh

替代bash vault.sh,这样脚本不会启动子shell,直接继承当前会话的认证上下文。

方法三:统一脚本与终端的az命令路径

在终端执行which az得到az的绝对路径,然后在脚本里用绝对路径调用az,避免环境变量差异导致的问题:

/usr/bin/az login
Source_Kv_Name="myKeyVault2020"
SECRETS+=($(/usr/bin/az keyvault secret list --vault-name $Source_Kv_Name --query "[].id" -o tsv))

内容的提问来源于stack exchange,提问作者Wojtas.Zet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:15:31