shell中存储aws assume-role命令到变量报command not found如何解决
错误原因拆解
- 变量名不符合Bash规范:Bash变量名仅允许包含字母、数字、下划线,不能使用短横线,
role-command为非法变量名,应该改为role_command - 双引号内反引号被解析为命令替换:你写在双引号内的
`=`等结构被Bash判定为要执行的命令,触发了command not found报错 - Sed用法错误:
sed -i是用来修改磁盘文件的,不能直接作用于变量值;同时你写的${role-command}是Shell参数默认值语法,含义是「如果role变量不存在则返回字符串command」,完全不是读取变量值的逻辑 - 命令存储方式问题:带复杂参数的命令直接存在普通字符串变量中,后续执行容易出现分词错误
正确实现方案
方案1:单引号赋值+内置变量替换(推荐)
单引号会关闭所有特殊字符解析,不需要转义反引号,仅需要对query参数里的单引号做特殊处理:
# 正确赋值命令变量 role_command='aws sts assume-role --role-arn arn:aws:iam::<acct_id>:role/AWS-Role --role-session-name temp-aws-rolesession --output text --duration-seconds 3600 --query '\''Credentials.[[join(`=`,[`AWS_ACCESS_KEY_ID`, AccessKeyId])],[join(`=`,[`AWS_SECRET_ACCESS_KEY`, SecretAccessKey])],[join(`=`,[`AWS_SESSION_TOKEN`, SessionToken])]]'\' # 替换账号占位符(内置功能,无需调用sed) role_command=${role_command/<acct_id>/97476414123} # 执行命令并直接导出凭证到当前Shell环境 eval $($role_command)
方案2:数组存储命令(最安全,无分词问题)
如果不需要动态拼接命令,直接用数组存储命令参数,执行更稳定:
role_command=( aws sts assume-role --role-arn "arn:aws:iam::97476414123:role/AWS-Role" --role-session-name temp-aws-rolesession --output text --duration-seconds 3600 --query 'Credentials.[[join(`=`,[`AWS_ACCESS_KEY_ID`, AccessKeyId])],[join(`=`,[`AWS_SECRET_ACCESS_KEY`, SecretAccessKey])],[join(`=`,[`AWS_SESSION_TOKEN`, SessionToken])]]' ) # 直接执行命令 "${role_command[@]}" # 需要导出凭证的话用:eval $("${role_command[@]}")
内容的提问来源于stack exchange,提问作者abhiks
相关产品推荐
相关产品推荐

