为gitlab yaml消毒bash字符串

时间:2019-06-21 12:34:32

标签: json bash gitlab sanitization

我无法转义包含控制字符的字符串

testRESULT=$(awk -F"Executed " '/Executed /{print $2}' results.out)

这是30秒内10个规格不完整(1个待处理)中的字符串9。

这是使用cmd的地方

curl -X POST -u ${JIRATOKEN} -H Content-Type:application/json --data '{"body":"'"$testRESULT"'- SauceLabs results available at '"\n$sauceLabsURL"'"}' https://EXAMPLEURL

这是错误

{"errorMessages":["Illegal unquoted character ((CTRL-CHAR, code 27)): has to be escaped using backslash to be included in string value\n at [Source: org.apache.catalina.connector.CoyoteInputStream@436d6c79; line: 1, column: 24]"]}

什么是清除Bash变量的最佳方法,该变量可以包含要传递给curl JSON的任何类型的char

1 个答案:

答案 0 :(得分:0)

错误所抱怨的字符是ASCII转义。您要逃避还是删除它?

我以为罪魁祸首是$testRESULT

要删除它的\27字符:

testRESULT="${testRESULT//$'\27'/}"

转义它(这将使整个字符串转义):

printf -v testRESULT '%q' "$testRESULT"

或仅转义ASCII转义:

ascii_esc='\27'    # literal (change to the form that is expected)
testRESULT="${testRESULT//$'\27'/$ascii_esc}"

然后,我将长的JSON字符串分解为一个数组,并在curl命令中使用array变量。这将使事情更具可读性和可维护性。并且不要忘记引用您的变量。

jsonstring=(
    '{"body":"'
    "$testRESULT"
    '- SauceLabs results available at '
    "\n$sauceLabsURL"
    '"}'
)

curl -X POST -u "$JIRATOKEN" -H Content-Type:application/json --data "${jsonstring[@]}" https://EXAMPLEURL

但是最终,您应该考虑使用适合该工作的工具(例如Python库等)来使用JSON。