首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将AWS环境变量保存到文件中--如何处理特殊字符“&”

将AWS环境变量保存到文件中--如何处理特殊字符“&”
EN

Stack Overflow用户
提问于 2017-01-12 02:29:41
回答 1查看 545关注 0票数 1

我试图通过cron在AWSElasticbean茎(EB)上运行django manage.py任务。

代码语言:javascript
运行
AI代码解释
复制
*/10 * * * * root /usr/local/bin/notification_cron.sh > /dev/null

notification_cron.sh脚本调用django manage.py任务。

Django需要EB的环境变量(如RDS_PORT、RDS_DB_NAME、RDS_PASSWORD等)。因此,我将这些环境变量保存到部署时的文件中,并在也调用manage.py任务的bash脚本中重新加载这些变量。

这是我在.ebextensions中部署配置的一部分。

代码语言:javascript
运行
AI代码解释
复制
commands:
  001_envvars_to_bash_source_file:
    command: |
      # source our elastic beanstalk environment variables
      /opt/elasticbeanstalk/bin/get-config --output YAML environment|perl -ne "/^\w/ or next; s/: /=/; print qq|\$_|" > /usr/local/bin/envvars
      chmod 755 /usr/local/bin/envvars

files:
  "/usr/local/bin/notification_cron.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash

      AWS_CONFIG_FILE="/home/ec2-user/.aws/config"
      set -o allexport
      # Loading environment data
      source /usr/local/bin/envvars
      set +o allexport
      cd /opt/python/current/app/
      source /opt/python/run/venv/bin/activate
      python manage.py my_management_task

这个问题是由线路引起的。

代码语言:javascript
运行
AI代码解释
复制
  /opt/elasticbeanstalk/bin/get-config --output YAML environment|perl -ne "/^\w/ or next; s/: /=/; print qq|\$_|" > /usr/local/bin/envvars

或替换sed等效

代码语言:javascript
运行
AI代码解释
复制
  /opt/elasticbeanstalk/bin/get-config environment --output yaml | sed -n '1!p' | sed -e 's/^\(.*\): /\1=/g' > /usr/local/bin/envvars

/usr/local/bin/envvars的内容并不总是在引号中:

代码语言:javascript
运行
AI代码解释
复制
PYTHONPATH="/opt/python/current/app/mydjangoapp:$PYTHONPATH"
DJANGO_SETTINGS_MODULE=mydjangoapp.settings
AWS_ACTIVE='true'
RDS_PORT='5432'
RDS_HOSTNAME=hostname.host.us-east-1.rds.amazonaws.com
RDS_USERNAME=master
RDS_DB_NAME=ebdb
RDS_PASSWORD=My&Password

这会在环境变量具有"&“字符的情况下引起麻烦。

代码语言:javascript
运行
AI代码解释
复制
'RDS_PASSWORD': My&Password

在调用django的source /usr/local/bin/envvars之前,Bash将其拆分为"&“字符,然后将它们导入到脚本中。

Phew.我的问题是:

如何在不中断其他行(如RDS_PASSWORD="My&Password" )的情况下在/usr/local/bin/envvars文件中获得RDS_PORT='5432' (注意所需双引号)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-12 02:53:09

使用GNU sed,你可以做如下的事情,

代码语言:javascript
运行
AI代码解释
复制
sed -r 's/RDS_PASSWORD=([[:graph:]]+)/RDS_PASSWORD="\1"/' /usr/local/bin/envvars
PYTHONPATH="/opt/python/current/app/mydjangoapp:$PYTHONPATH"
DJANGO_SETTINGS_MODULE=mydjangoapp.settings
AWS_ACTIVE='true'
RDS_PORT='5432'
RDS_HOSTNAME=hostname.host.us-east-1.rds.amazonaws.com
RDS_USERNAME=master
RDS_DB_NAME=ebdb
RDS_PASSWORD="My&Password"

然后,您可以将-i标志添加到sed到就地替换。我使用了字符类[[:graph:]],它是

代码语言:javascript
运行
AI代码解释
复制
[:graph:]’
Graphical characters:[:alnum:]’ and ‘[:punct:].

作为[:punct:]的一部分的特殊字符包括

代码语言:javascript
运行
AI代码解释
复制
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

因此,如果上述任何字符构成了sed变量,则RDS_PASSWORD可以处理替换。

您可以使用的语法是

代码语言:javascript
运行
AI代码解释
复制
 /opt/elasticbeanstalk/bin/get-config environment --output yaml | \
    sed -n '1!p' | sed -e 's/^\(.*\): /\1=/g' | \
    sed -r 's/RDS_PASSWORD=([[:graph:]]+)/RDS_PASSWORD="\1"/' > /usr/local/bin/envvars 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41610788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档