在YAML文件中使用的Bash特殊字符

时间:2017-11-29 22:33:38

标签: bash yaml travis-ci

我正在努力使用一些为我生成一些环境变量的bash脚本。我稍后在 .travis.yml 文件中使用它。

我的加密密钥如下:

someRandomCharacters withNewLine

在航站楼,我检查了三种可能性。

echo "someRandomCharacters
withNewLine" | openssl enc -aes-128-cbc -a -salt -pass pass:SomePassword -base64 -d

echo "someRandomCharacters\nWithNewLine" | openssl enc -aes-128-cbc -a -salt -pass pass:SomePassword -base64 -d

会给我正确的输出。

echo "someRandomCharactersWithNewLine" | openssl enc -aes-128-cbc -a -salt -pass pass:SomePassword -base64 -d

上面的这个将返回error reading input file

到目前为止一切都那么好 - 我理解为什么它会这样。但是当我尝试输入任何上述选项时 - 例如:

 - SOME_ENV=`echo "someRandomCharacters\nWithNewLines" | openssl enc -aes 128-cbc -a -salt -pass pass:SomePassword -base64  -d`

进入 travis.yml ,两个最后选项将返回error reading input file,第一个将导致整个版本崩溃不正确的 .yaml 语法。

我尝试使用上面这三个中的任何一个+更多,例如 “\ n” 作为我在STO上的示例中找到的特殊字符。他们中的任何一个都会返回error reading input file,但没有一个人将我解密SOME_ENV给了travis。那有什么解决方案吗?或许我对BASH和YAML的糟糕经历阻碍了我看到明显的错误?

1 个答案:

答案 0 :(得分:2)

虽然很难说出假数据到底是什么问题,但这里有一些数据点:

dash(如果您在现代Linux发行版上运行sh,则获得的shell)和bash在某些情况下表现不同。

您永远不应该假设代码段与bash一起运行,因为任何原因都可能导致它与sh一起运行,而且有时很难说。

这是一个包含\n序列的脚本,该序列与sh一起使用但与bash失败:

$ cat myfile
echo "U2FsdGVkX19EB+D8no\n9+9bnl4dE5H2WbOUSvsGZjK7s=" | openssl enc -aes-128-cbc -a -salt -pass pass:MyPassword -base64 -d

$ sh myfile
My test data

$ bash myfile
error reading input file

如果我们改为使用echo -e,我们会得到相反的结果dash失败且bash有效:

$ cat myfile
echo -e "U2FsdGVkX19EB+D8no\n9+9bnl4dE5H2WbOUSvsGZjK7s=" | openssl enc -aes-128-cbc -a -salt -pass pass:MyPassword -base64 -d

$ sh myfile 
error reading input file

$ bash myfile
My test data

这就是POSIX建议不使用echo的原因。如果我们改为使用printf,则它适用于:

$ cat myfile
printf "U2FsdGVkX19EB+D8no\n9+9bnl4dE5H2WbOUSvsGZjK7s=\n" | openssl enc -aes-128-cbc -a -salt -pass pass:MyPassword -base64 -d

$ sh myfile
My test data

$ bash myfile
My test data

但是,openssl中间的换行顺序是可选的,可以删除(即使你似乎说这不起作用:也许你删除了\但是不是n?)

$ cat myfile 
echo "U2FsdGVkX19EB+D8no9+9bnl4dE5H2WbOUSvsGZjK7s=" | openssl enc -aes-128-cbc -a -salt -pass pass:MyPassword -base64 -d

$ sh myfile
My test data

$ bash myfile
My test data