我正在努力使用一些为我生成一些环境变量的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的糟糕经历阻碍了我看到明显的错误?
答案 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