2013-08-03 2 views
6

환경 변수 파일을 읽을 수있는 방법이 있습니까? 배쉬에서Ruby에서 파일에서 변수 읽기

내가 사용할 수있는 파일 env.sh이

env.sh

foo="bar" 

bash는 파일

set -a 
source env.sh 

이 날 것처럼 foo에 사용할 수 있도록 할 나는 루비 스크립트에서 그것을 delcared했다.

또한이 파일에 암호를 저장할 수 있도록이 파일을 읽을 수 없는지 확인하는 방법이 있습니까?

+0

이름/값 쌍 파일을 구문 분석하는 것은 쉽습니다. 너 뭐 해봤 니? 그리고 누구에게 파일을 읽을 수 없게하고 싶습니까? –

+0

@theTinMan 필자는 파일에 대해 아직 아무 것도 시도하지 않았지만 빠른 Google 검색을 수행했으며 찾고 있던 내용과 정확히 일치하는 것이 아무것도 없었기 때문에 그 이유는 내가 왜 그 파일의 소유자가 아닌 사람에게도 읽을 수 있고 읽을 수 없는지 묻는 이유입니다. 파일 –

답변

4

는 동안 소리 어쩌면 저장소에있는 민감한 정보로 파일을 보관하지 않아도됩니다. 참고 : 파일 보안은 파일이있는 위치와 운영 체제 및 서버 소프트웨어에 의해 해결됩니다.

이 경우, 구성중인 프로그램의 관리자/사용자에게 필요한 종류의 템플리트가 들어있는 파일을 제공 할 수 있습니다.

루비는 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' 

이로드하고 자유롭게에 의해 수정되는 단지 루비 파일입니다 사용하는 파일 소프트웨어의 사용자/관리자이며이 모양이며 공개적으로 공유됩니다.

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

이 파일을로드하고 세계적으로 응용 프로그램에 대한 일정한 범위 인 ENV을 사용합니다.

파일 사용 권한은 시스템의 사용자/관리자가 관리하며 시스템의 다른 중요한 정보처럼 보호됩니다. 민감한 파일은 저장소의 무시 메커니즘에도 나열되어야합니다. 결코 공개해서는 안됩니다.

0

네, 거기, 당신이 그것을 사용해야합니다 일부 희한, 비밀의 이유, 그것은 평가의 경우 :

경고 : 당신이 정말, 정말 좋은 이유

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 

, 그들이 클래스 또는 인스턴스에 속해 있으므로 같아야 그러한 환경에서 정의됩니다. 그리고 다른 파일에서 동일한 클래스를 다시 열어 다른 파일에로드 할 수 있습니다.

file-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

그건 의미가 있습니다, 나는 암호 등을 내 프로그램에서 지우려고했기 때문에 그 방법으로로드하려고했습니다. 이것은 스크립트 일 뿐이며 클래스를 만들 계획이 아닙니다. –