-1

我正在尝试在远程 AWS Windows Server 2016 数据中心上运行 BitBucket 管道。

image: python:3.5.1

pipelines:
  custom: # Pipeline that only runs manually
    default:
      - step:
          caches:
            - pip
          script: # Modify the commands below to build your repository.
            - pip install awscli
            - <- 
              aws ssm send-command 
              --document-name "AWS-RunRemoteScript" 
              --instance-ids "i-000000000000000" 
              --parameters '{\"sourceType\":[\"S3\"],\"sourceInfo\":[\'{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}\'],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\\\TOM\"]}' 
              --timeout-seconds 600 
              --region us-east-2

当我尝试运行管道时,出现以下错误:

+ <- aws ssm send-command --document-name "AWS-RunRemoteScript" --instance-ids "i-000000000000000" --parameters '{\"sourceType\":[\"S3\"],\"sourceInfo\":[\'{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}\'],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\\\TOM\"]}' --timeout-seconds 600 --region us-east-2
bash: /opt/atlassian/pipelines/agent/tmp/bashScript5876925824407417765.sh: line 8: unexpected EOF while looking for matching `''

我已经研究了 2-3 次语法,但不确定到底是什么问题。我在命令中看不到任何额外的单引号。任何帮助将不胜感激。

更新 1

@rici:

+ aws ssm send-command  --document-name "AWS-RunRemoteScript"  --instance-ids "i-0000000000000000"  --parameters '{"sourceType":["S3"],"sourceInfo":['\''{"path":"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1"}'\''],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\TOM"]}'

Error parsing parameter '--parameters': Invalid JSON: Expecting value: line 1 column 36 (char 35)
JSON received: {"sourceType":["S3"],"sourceInfo":['{"path":"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1"}'],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\TOM"]}

更新 2

+ aws ssm send-command --document-name "AWS-RunRemoteScript" --instance-ids "i-0000000000000000" --parameters '{\"sourceType\":[\"S3\"],\"sourceInfo\":["{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}"],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\\\TOM\"]}' --timeout-seconds 600 --region us-east-2
Error parsing parameter '--parameters': Invalid JSON: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
JSON received: {\"sourceType\":[\"S3\"],\"sourceInfo\":["{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}"],\"executionTimeout\":[\"3600\"],\"commandLine\":[\"test.ps1\"],\"workingDirectory\":[\"C:\\\\TOM\"]}
4

1 回答 1

2

在 shell 中,在单引号字符串内,反斜杠不会转义任何内容。他们只是普通的人物。此外,您可以将多个带引号或不带引号的字符串段连接在一起,只需将它们写在一起,只要引用空格即可。

因此,如果您有:

'abc\'def\'ghi'

你得到:

  • 由四个字符组成的单引号段abc\。第二个'终止这个引用的段。
  • 未加引号的字符def
  • 反斜杠转义'(因为反斜杠确实在单引号段之外转义引号)
  • 未加引号的字符ghi
  • 最后,一个无与伦比的',导致错误消息。

由于反斜杠是单引号字符串中的普通字符,因此您可能也不希望在双引号之前使用反斜杠。因此,您的目标可能是:

--parameters '{"sourceType":["S3"],"sourceInfo":['\''{"path":"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1"}'\''],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\\\TOM"]}'

注意序列的使用'\''

  • 关闭单引号段
  • 插入单引号
  • 打开一个新的单引号段

由于不可能将单引号放在单引号字符串中,因此这个习语很常见,尽管它通常写为'"'"'.

但是,我并不完全相信您真的应该单引号该sourceInfo参数。如果这应该是 JSON,则单引号无效,因此sourceInfo参数的值需要双引号,并且该字符串值内的双引号需要转义:

--parameters '{"sourceType":["S3"],"sourceInfo":["{\"path\":\"https://s3.us-east-2.amazonaws.com/my-bucket-name/test.ps1\"}"],"executionTimeout":["3600"],"commandLine":["test.ps1"],"workingDirectory":["C:\\\\TOM"]}'
于 2018-08-12T06:08:09.950 回答