我正在尝试编写一个脚本以在awscreds.template中插入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 :(得分:2)
AWSSecretKey
值包含/
字符,用作sed命令中的分隔符。
尝试将sed子句分隔符替换为另一个字符。
例如:
sed -i '/AWSAccessKeyId=/s~$~'"$access"'~' awscreds.template
sed -i '/AWSSecretKey=/s~$~'"$secret"'~' awscreds.template
答案 1 :(得分:1)
你需要使用awk来强有力地执行此操作,因为sed无法对任意字符串进行操作。这适用于输入文件或替换文本中的任何字符串:
$ secret='a&b/\t=\1' awk '/^AWSSecretKey=/ { sub(/=.*/,"="); $0=$0 ENVIRON["secret"] } 1' file
AWSSecretKey=a&b/\t=\1
答案 2 :(得分:0)
问题是 sed 的转移者。凭证包含 / ,它也在 sed 语句中使用。所以我最终只是将凭证回显到文件中。我知道这不是最优雅的方式。但它运作良好。
echo "AWSAccessKeyId=$access" > awscreds.template
echo "AWSSecretKey=$secret" >> awscreds.template