Makefile传递含特殊字符的AWS密钥至Skaffold时变量求值失败求助
Makefile传递含特殊字符的AWS凭证给Skaffold失败
我在写Makefile时遇到问题:从AWS Secrets Manager拉取数据库凭证,传递给Skaffold时,含特殊字符的密码被Shell错误解析,导致执行失败。试过用单引号、双引号包裹变量,也试过加$$转义,都没解决。平时都是赶时间在实操里学,每次都手忙脚乱,完全没乐趣,也不知道怎么系统提升这方面的技能。
我的Makefile代码
production-release: $(eval creds := $(shell aws --profile $(AWS_PROFILE) secretsmanager get-secret-value --secret-id $(RDS_SECRET_ID) --query SecretString --output json)) $(eval user := $(shell echo $(creds) | jq -r .username)) $(eval password := $(shell echo $(creds) | jq -r .password)) @$(MAKE) .skaffold-build PROFILE=production PG_USER=$(user) PG_PASSWORD=$(password)
错误输出
/bin/bash: line 1: GPhADd-6Y: No such file or directory
注:完整密码是O}Kyfg|42t$~*!.w_f<GPhADd-6Y,里面的<被Shell当成了重定向符号,导致把后面的GPhADd-6Y当作文件名解析,所以报错找不到文件。
解决方法
问题核心是Make展开变量后,Shell会解析密码里的特殊字符(比如$、<、|、!这些)。可以通过两种方式修复:
方式一:给变量值加单引号,避免Shell解析特殊字符
修改Makefile,在传递变量和处理creds时用单引号包裹:
production-release: $(eval creds := $(shell aws --profile $(AWS_PROFILE) secretsmanager get-secret-value --secret-id $(RDS_SECRET_ID) --query SecretString --output json)) $(eval user := $(shell echo '$(creds)' | jq -r .username)) $(eval password := $(shell echo '$(creds)' | jq -r .password)) @$(MAKE) .skaffold-build PROFILE=production PG_USER='$(user)' PG_PASSWORD='$(password)'
- 用
echo '$(creds)'确保creds里的特殊字符不会被Shell提前解析 - 传递
PG_USER='$(user)'和PG_PASSWORD='$(password)',让Shell把整个字符串当作单一参数处理
方式二:直接在Shell环境中定义变量,减少Make的eval操作
这种方式跳过Make的变量展开,直接在Shell里完成凭证获取和变量定义:
production-release: @PG_USER="$$(aws --profile $(AWS_PROFILE) secretsmanager get-secret-value --secret-id $(RDS_SECRET_ID) --query SecretString --output json | jq -r .username)" \ PG_PASSWORD="$$(aws --profile $(AWS_PROFILE) secretsmanager get-secret-value --secret-id $(RDS_SECRET_ID) --query SecretString --output json | jq -r .password)" \ $(MAKE) .skaffold-build PROFILE=production
- 用
$$让Make把$传递给Shell,避免Make提前展开命令 - 变量值用双引号包裹,Shell会保留特殊字符的原样
内容的提问来源于stack exchange,提问作者set92
相关产品推荐
相关产品推荐

