Azure发布管道中$符号被解析为Linux变量的问题排查
问题原因
你的核心问题是变量被两次解析:
- Azure DevOps发布管道首先会替换脚本中的
$(ConnectionString)变量,把它替换成包含$符号的实际连接字符串(比如Pas$word!Now)。 - 替换后的字符串通过ssh传到远程Linux服务器时,远程bash会把字符串里的
$word识别为不存在的shell变量,直接替换为空,最终密码变成Pas!Now。
之前尝试的单双引号没生效,是因为没在远程bash层面彻底阻止$的解析,也没在Azure DevOps层面提前对$做转义处理。
解决方案
以下是几种可靠的解决方法,按推荐程度排序:
方法1:在Azure DevOps中转义$符号
利用Azure DevOps的变量替换语法,把连接字符串中的$替换成\$,远程bash解析时会自动把\$还原成$,保留原密码。
修改脚本中的docker run命令行:
ssh devops@server '/usr/bin/docker run -p80:80 --name container01 --network opened -e ASPNETCORE_ENVIRONMENT=PRD -e ConnectionStrings:my-db=${ConnectionString//$/\$} -d register:5000/container01:$(Release.ReleaseName)'
这里的${ConnectionString//$/\$}是Azure DevOps的变量替换语法,作用是把ConnectionString变量里的所有$替换成\$。
方法2:用单引号在远程层面包裹环境变量值
在远程的docker命令中,用单引号把连接字符串内容包裹起来,bash不会解析单引号内的任何变量(包括$)。
修改后的命令行:
ssh devops@server '/usr/bin/docker run -p80:80 --name container01 --network opened -e ASPNETCORE_ENVIRONMENT=PRD -e "ConnectionStrings:my-db='${ConnectionString}'" -d register:5000/container01:$(Release.ReleaseName)'
这里用嵌套引号:外层双引号包裹整个-e参数值,内层单引号包裹$(ConnectionString)替换后的内容,确保远程bash不会解析其中的$。
方法3:使用.env文件传递环境变量
避免在命令行直接暴露带特殊字符的连接字符串,生成.env文件上传到远程,让docker从文件读取环境变量:
修改发布脚本步骤:
steps: - script: | # 在本地生成.env文件 echo "ConnectionStrings:my-db=$(ConnectionString)" > app.env # 上传到远程服务器 scp app.env devops@server:/tmp/app.env # 拉取镜像、停止并删除旧容器 ssh devops@server /usr/bin/docker image pull register:5000/container01:$(Release.ReleaseName) ssh devops@server /usr/bin/docker container stop container01 ssh devops@server /usr/bin/docker rm -f container01 || true # 使用env-file启动容器 ssh devops@server '/usr/bin/docker run -p80:80 --name container01 --network opened -e ASPNETCORE_ENVIRONMENT=PRD --env-file=/tmp/app.env -d register:5000/container01:$(Release.ReleaseName)' # 清理远程的.env文件和无用镜像 ssh devops@server 'rm /tmp/app.env' ssh devops@server /usr/bin/docker image prune -fa || true displayName: 'Run container' env: ConnectionString: $(MY_LIBRARY_CONNSTRING)
这种方法完全避免了命令行中的特殊字符解析问题,同时更安全(不会在命令历史中留下敏感的连接字符串)。
内容的提问来源于stack exchange,提问作者Leandro De Mello Fagundes
相关产品推荐
相关产品推荐

