从Ruby中的文件中读取变量

时间:2013-08-03 05:05:56

标签: ruby file environment-variables

有没有办法读取环境变量的文件?

在bash中我有一个我可以使用的文件env.sh

env.sh

foo="bar"

bash文件

set -a
source env.sh

这样我就可以使用foo,好像我已经在ruby脚本中对它进行了删除。

还有一种方法可以确保此文件不可读,以便密码可以存储在此文件中吗?

3 个答案:

答案 0 :(得分:5)

听起来您应该为用户/管理员提供一个文件示例来修改其个人环境,然后从中填充环境,同时避免将该文件与存储库中的敏感信息一起使用。注意:每个文件的安全性将由文件所在的位置以及操作系统和服务器软件来解决。

如果是这种情况,那么您可以提供一个文件,其中包含您正在配置的程序的管理员/用户需要的类型的模板。

Ruby具有ENV常量,其作用类似Hash,并保存您正在使用的shell的环境。

例如,有一个名为environment.rb.sample的文件可以公开与任何人共享。它具有说明并保存用户可以自由修改的模板,并附有将文件复制到environment.rb的说明。示例文件如下所示:

# environment.rb.sample
# Copy this file to environment.rb and change the name and password to your credentials
ENV['temp_user_name'] = 'Foo Bar'
ENV['temp_password'] = 'Dazz Kezz

然后将文件复制到此文件,可能是:

# environment.rb
ENV['temp_user_name'] = 'Joe Admin'
ENV['temp_password'] = 'Super Secure Password'

加载它并使用它的文件只是一个由软件的用户/管理员自由修改的Ruby文件,看起来像这样,也是公开共享的。

# load_environment
require './environment'
puts ENV['temp_user_name']
puts ENV['temp_password']

这将加载文件并使用ENV作为应用程序的全局作用域常量。

然后,文件权限由系统的用户/管理员进行管理,并像其他系统上的其他敏感信息一样受到保护。敏感文件也应列在存储库的忽略机制中。它永远不应该公开。

答案 1 :(得分:2)

局部变量的目的是在方法定义或块中暂时使用。在这样的环境之外使用它,特别是跨文件使用它会破坏它的目的。你不应该这样做,而Ruby没有一种简单的方法可以做到。

如果正确使用变量,并希望在文件之间共享变量,则应该是其他类型的变量,例如实例,类或全局变量。或者,为了设置环境,您应该使用常量。其中,全局变量和常量可以写在文件中,加载到不同的文件中,然后使用。

文件a.rb

$foo = 1
FOO = 2

文件b.rb

load "file-a.rb"
$foo # => 1
FOO # => 2

对于实例和类变量,它们属于它的类或实例,因此应该在这样的环境中定义它们。并且您可以在不同的文件中重新打开同一个类,并将其加载到另一个文件中。

文件a.rb

class Bar
  @@foo = 1
  def initialize; @foo = 2 end
end

文件b.rb

load "file-a.rb"
Bar.class_variable_get("@@foo") # => 1
Bar.new.instance_variable_get("@foo") # => 2

答案 2 :(得分:1)

是的,如果出于某些古怪的原因,你必须使用它,那就是eval:

警告:除非你有一个非常非常好的理由,否则不要使用它

eval(File.read("name_of_var_file"), binding)

如果您真正想要做的是编写配置文件,请使用YAML。像这样的文件:

config.yaml:

foo: "bar"

可以像这样访问:

require 'yaml'
conf = YAML.loads(File.read("config.yaml"))
conf['foo'] #=> 'bar'

这是安全且易于管理的,更不用说标准做法了。


至于使文件不可访问,这是一个操作系统级问题,如果没有环境,操作系统,设置等信息就无法解决。