含DNS变量的双引号Bash脚本运行失败,求排查解决
问题
原本使用单引号包裹的Bash脚本可正常运行(需硬编码EC2的PublicDNS):
sh ''' ssh -o StrictHostKeyChecking=no \ -i my-key.pem \ ec2-user@ec2-xxx-xxx.amazonaws.com \ "sudo yum update -y && \ sudo yum install docker -y && \ sudo systemctl start docker && \ sudo docker pull image/test:be && \ sudo docker run -d -p 8080:8080 image/test:be" '''
将DNS替换为变量$DNS并改用双引号包裹脚本后,出现错误:
sh """ ssh -o StrictHostKeyChecking=no \ -i my-key.pem \ ec2-user@$DNS \ "sudo yum update -y && \ sudo yum install docker -y && \ sudo systemctl start docker && \ sudo docker pull image/test:be && \ sudo docker run -d -p 8080:8080 image/test:be" """
错误信息:
/var/jenkins_home/workspace/script.sh: 3: sudo yum update -y && sudo yum install docker -y && sudo systemctl start docker && sudo docker pull image/test:be && sudo docker run -d -p 8080:8080 image/test:be: not found
解决方案
错误根源是双引号嵌套导致的解析异常:外层用双引号时,内层的双引号会被本地Shell当作外层引号的结束标记,导致ssh命令的远程执行参数被错误拆分,本地Shell会把原本要传给远程的整条命令当作一个不存在的本地命令去执行。
修复方法有两种:
方法1:内层命令改用单引号
外层双引号解析$DNS变量,内层用单引号包裹远程执行的命令,避免引号冲突:
sh """ ssh -o StrictHostKeyChecking=no \ -i my-key.pem \ ec2-user@$DNS \ 'sudo yum update -y && \ sudo yum install docker -y && \ sudo systemctl start docker && \ sudo docker pull image/test:be && \ sudo docker run -d -p 8080:8080 image/test:be' """
方法2:转义内层双引号
保留内层双引号,但用反斜杠\转义,让本地Shell把它当作普通字符处理,传递给远程主机:
sh """ ssh -o StrictHostKeyChecking=no \ -i my-key.pem \ ec2-user@$DNS \ \"sudo yum update -y && \ sudo yum install docker -y && \ sudo systemctl start docker && \ sudo docker pull image/test:be && \ sudo docker run -d -p 8080:8080 image/test:be\" """
内容的提问来源于stack exchange,提问作者Hassan Raza
相关产品推荐
相关产品推荐

