2013-08-03 10 views
6

環境変数のファイルを読む方法はありますか? bashでRubyのファイルから変数を読み込む

私が使用できるファイルenv.shを持って

env.sh

foo="bar" 

bashのファイル

set -a 
source env.sh 

これは私だけの場合と同様にFOOを使用できるようになります私はルビーのスクリプトでそれをdelcaredていた。

また、このファイルにパスワードを保存できるように、このファイルが読み取れないことを確認する方法はありますか?

+0

名前と値のペアのファイルを解析するのは簡単です。何を試しましたか?そして、誰にファイルを読めないようにしたいのですか? –

+0

@theTinMan私はファイルのためにまだ何も試していない、私は迅速なGoogle検索を行ったと何も私が探していたので、私はそれが可能だったと誰にも読めないファイル –

答えて

4

、しばらくおそらく、そのファイルをリポジトリ内の機密情報と一緒に持つことを避けてください。注:ファイルごとのセキュリティは、ファイルの場所とオペレーティングシステム、およびサーバーソフトウェアによって解決されます。

この場合、構成するプログラムの管理者/ユーザーから必要とされる種類のテンプレートを保持するファイルを提供できます。

RubyはHashのように動作し、使用しているシェルの環境を保持する定数であるENVを持っています。

例として、誰でも公然と共有される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を使用しています。

ファイルのアクセス許可は、システムのユーザー/管理者によって管理され、システム上の他の機密情報と同様に保護されます。機密ファイルは、リポジトリの無視メカニズムにもリストされている必要があります。公開されるべきではありません。

0

はい、あり、そしてあなたがそれを使用しなければならないいくつかの奇怪な、不可解な理由であれば、それは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' 

これは標準的な手法はもちろんのこと、安全で管理可能です。


ことは、環境上の情報なしには解決できない、オペレーティング・システム・レベルの問題でアクセスできないファイルを作成するためとして

、OS、設定、など

+0

なぜ私は好奇心からの評価を使わないのですか? –

+0

なぜユーザから提供されたファイルからevalを使用しないのは、実際には危険が伴うからです。これについての情報は、インターネット上にはかなりあります。そして、おそらくここに。またはセキュリティエクスチェンジ。 – vgoff

+0

これは単に質問の環境変数部分に対処していません。 – vgoff

1

ローカル変数の目的は、メソッド定義またはブロック内で一時的に使用することができます。そのような環境の外部で、特にファイル間でそれを使用することは、その目的を凌駕します。あなたはそれをする必要はありません。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 
+0

それは理にかなっています、私はパスワードなどを自分のプログラムから守ろうとしていたので、そういう形でそれらをロードしようとしていたのです。これは単なるスクリプトであり、クラスを作成する予定はありません –

関連する問題