2017-11-29 7 views
0

私にはいくつかの環境変数を生成するいくつかのbashスクリプトが苦労しています。私は.travis.ymlファイルでそれを使用しています。YAMLファイルで使用されるBash特殊文字

私の暗号化キーは、次のようになります。ターミナルで

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 

この1つは上記のこれまでのところは良いerror reading input file

を返します - それはそのように動作しますなぜ私は理解しています。私は、上記のいずれかのオプションを入力しようとすると、しかし - そのような例:

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

travis.yml、2つの最後オプションはerror reading input fileを返し、最初のものが原因全体のビルドをクラッシュします不正確に.yamlの構文です。

私はここにSTO上の例に見られるような「\ n」はなどの特殊文字で、たとえば、より多くの+の上にこれら三つのいずれかを使用しようとしました。それらのいずれかがerror reading input fileを返し、いずれも返されず、SOME_ENVがトラビスに復号化されました。そのための解決策はありますか? BASHとYAMLの私の貧しい経験は、明らかな間違いを見て私をブロックするかもしれませんか?

+1

あなたのすべてのコマンドを削除しました。無効なデータを投稿し、データが無効である理由を尋ねています。これは理由を説明するのが難しい。 [MCVE](https://stackoverflow.com/help/mcve)の作成を検討してください。たとえば、 'U2FsdGVkX1821xiZpgtUK7OIbGrHzGCPbN + bJ1WYKmg ='を使用して、あなたの偽のパスワードが "My data"にデコードされると、あなたの改行をどこにでも置くことができます。 '' bash 'はしませんが '' dash'は '\ n'を展開するためですが、' openssl'はb64データの途中で改行を必要としないため、作成した例は矛盾しています。 –

+0

あなたは私のすべてのコマンドが常にこのエラーを印刷するということを何を意味するのか説明してください。 私の製作例が矛盾しているとはどういう意味ですか?私はTerminalで実際の価値観やアウトプットを横並びにチェックしていましたが、その例が適切であるとは確信しています。私はスクリーンショットを提供するだろうが、それはポイントを逃すだろう。 – Drwalcore

+1

私はあなたのポストからコマンドを端末にコピー&ペーストすれば失敗する(実際の値は含まれていないので)。あなたの本当の価値観を「左右に」走らせずに、あなたが快適に共有できる価値を生み出し、それらを掲示してください。例えば、これは端末に直接コピー・ペーストできるコマンドです: 'echo" U2FsdGVkX19EB + D8no9 + 9bnl4dE5H2WbOUSvsGZjK7s = "| openssl enc -aes-128-cbc -a -salt -pass pass:MyPassword -base64 -d' –

答えて

2

それは正確に問題が偽のデータを与えられているものを伝えるのは難しいですが、ここではいくつかのデータポイントである:

dash(シェルあなただけの最近のLinuxディストリビューション上sh実行する場合は、取得)、特定のでは異なるとbash振る舞いをケース。

コードスニペットがbashで実行されるとは決して考えないでください。理由の多くは、shで実行される可能性があります。

ここshで動作しますが、bashで失敗\n配列を含むスクリプトです:

$ 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