2016-09-26 19 views
0

awscreds.templateにAPIクレデンシャルを挿入するスクリプトを作成しようとしています。ただし、シークレットには特殊文字が含まれています。 は、例として:AWS APIクレデンシャルを挿入するスクリプト

AWSAccessKeyId=AKIAJ5YhzvVUZnPTBVRA 
AWSSecretKey=fRUZnUVUZnUvYhzvJVpwyn/xN3Oo0l3icqRy0//+ 

私のスクリプトのリクエスト:その後、

echo "Entre the Access Key, followed by an ENTER:" 
read access 
echo "Entre the Secret Key, followed by an ENTER:" 
read secret 

してファイルに挿入します:私は、スクリプトを実行したときに

sed -i '/AWSAccessKeyId=/s/$/'$access'/' awscreds.template 

sed -i '/AWSSecretKey=/s/$/'$secret'/' awscreds.template 

しかし、私は以下のようになります。

sed: -e expression #1, char 44: unknown option to `s' 

少しの調査をした後、''を入力制限するのに確実に使用しましたが、同じアラームが表示されます。しかし、なぜ私はまだこのエラーが発生していますか?

+0

どのバージョンの 'sed'を使用していますか? 'sed --version'の出力です。 'GNU sed version 4.2.1'でうまく働いています – Inian

+0

良い質問です。 AMIにあらかじめインストールされています:** GNU sed version 4.2.1 ** – SSF

+0

あなたには役に立たなかった 'secret'の値は何ですか? – Inian

答えて

0

問題がSEDのdeliminatorました。信任状は、/を含み、sedステートメントでも使用されていました。だから、私はちょうどファイルに資格情報をエコーし​​てしまった。私はそれがこれを行う最もエレガントな方法ではないことを知っています。しかし、それはうまくいった。

echo "AWSAccessKeyId=$access" > awscreds.template 
echo "AWSSecretKey=$secret" >> awscreds.template 
2

AWSSecretKeyの値には、/文字が含まれています。この文字は、sedコマンドの区切り文字として使用されます。

sed subtitution delimiterを別の文字に置き換えてください。

例:

sed -i '/AWSAccessKeyId=/s~$~'"$access"'~' awscreds.template 
sed -i '/AWSSecretKey=/s~$~'"$secret"'~' awscreds.template 
+0

うわー!ニースの観察!似たような行を考えていただけでした。 – Inian

+0

しかし、それを別の文字に置き換えると、その秘密が変更されず、結果としてAWSクラウドウォッチにメトリックが送信されません。 – SSF

+0

シークレットは変更されません。ここでsed 'sコマンド区切り文字を置き換えてください。この問題の詳細はこちら[こちら](http://stackoverflow.com/questions/9366816/sed-unknown-option-to-s)をご覧ください。 – SLePort

1

あなたはSEDは、任意の文字列を操作することはできませんので、確実にこれを行うにはawkを使用する必要があります。これは、入力ファイルまたは置換テキストで任意の文字列のために動作します:

$ secret='a&b/\t=\1' awk '/^AWSSecretKey=/ { sub(/=.*/,"="); $0=$0 ENVIRON["secret"] } 1' file 
AWSSecretKey=a&b/\t=\1 
関連する問題