8

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

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

环境文件

foo="bar"

.bash 文件

set -a
source env.sh

这将允许我只使用 foo ,就好像我在 ruby​​ 脚本中使用它一样。

还有没有办法确保这个文件不可读,以便密码可以存储在这个文件中?

4

3 回答 3

6

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

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

Ruby 有一个ENV常量,它的作用类似于 aHash并保存您正在使用的 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应用程序的全局范围常量。

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

于 2013-08-03T05:51:53.780 回答
3

是的,有,如果出于某种奇怪、神秘的原因你必须使用它,它是 eval:

警告:切勿在用户提供的文件上使用它

而且,除非您有非常非常具体的需求,否则不要在生产代码中使用它。

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

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

配置.yaml:

foo: "bar"

可以这样访问:

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

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


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

于 2013-08-03T05:14:46.610 回答
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
于 2013-08-03T05:27:50.887 回答