2013-08-03 59 views
6

Có cách nào để đọc trong một tệp biến môi trường không?Đọc các biến từ một tệp trong Ruby

Trong bash Tôi có một env.sh tập tin mà tôi có thể sử dụng

env.sh

foo="bar" 

tập tin bash

set -a 
source env.sh 

Điều này sẽ cho phép tôi chỉ cần sử dụng foo như thể Tôi đã delcared nó trong kịch bản ruby.

Ngoài ra, có cách nào để đảm bảo rằng tệp này không đọc được để mật khẩu có thể được lưu trữ trong tệp này?

+0

Phân tích cú pháp tệp của các cặp tên/giá trị thật dễ dàng. Bạn đã thử cái gì? Và, bạn muốn làm cho tập tin không đọc được cho ai? –

+0

@ theTinMan Tôi chưa thử bất kỳ thứ gì cho tệp, tôi đã tìm kiếm nhanh trên google và không có gì khớp chính xác với những gì tôi đang tìm kiếm, đó là lý do tôi hỏi nếu có thể và không thể đọc được với bất kỳ ai không phải là chủ sở hữu file –

Trả lời

4

Có vẻ như bạn cần cung cấp một ví dụ tập tin cho người dùng/quản trị để thay đổi cho môi trường cá nhân của họ, và sau đó cư môi trường từ đó, trong khi tránh, có lẽ, có tập tin đó với các thông tin nhạy cảm trong một kho lưu trữ. Lưu ý: mỗi tệp bảo mật sẽ được giải quyết theo vị trí tệp được đặt và hệ điều hành của bạn và phần mềm máy chủ.

Nếu trường hợp này xảy ra, bạn có thể cung cấp tệp chứa mẫu của những thứ bạn sẽ yêu cầu từ quản trị viên/người dùng của chương trình bạn đang định cấu hình.

Ruby có hằng số ENV hoạt động như Hash và giữ môi trường của vỏ bạn đang sử dụng.

Ví dụ: có một tệp có tên là environment.rb.sample được chia sẻ với bất kỳ ai, công khai. Nó có hướng dẫn và giữ mẫu mà người dùng có thể sửa đổi một cách tự do, với hướng dẫn sao chép tệp sang environment.rb. Tệp mẫu trông như thế này:

# 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 

File này sau đó sao chép vào này, có lẽ:

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

file mà tải này và sử dụng nó chỉ là một tập tin của Ruby được tự do sửa đổi theo người dùng/quản trị viên của phần mềm và trông giống như thế này và cũng được chia sẻ công khai.

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

Điều này tải tệp và sử dụng ENV là hằng số trên phạm vi toàn cầu cho ứng dụng.

Quyền tệp sau đó được quản lý bởi người dùng/quản trị viên của hệ thống và được bảo mật giống như mọi thông tin nhạy cảm khác trên hệ thống của họ. Tệp nhạy cảm cũng phải được liệt kê trong cơ chế bỏ qua của kho lưu trữ. Nó không bao giờ được công khai.

0

Có, có, và nếu đối với một số bizzare, lý do phức tạp, bạn phải sử dụng nó, nó eval:

Chú ý: Không sử dụng này, trừ khi bạn có lý do thực sự, thực sự tốt

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

Nếu những gì bạn thực sự cố gắng làm là viết một tập tin cấu hình, sử dụng YAML. Một tập tin như thế này:

config.yaml:

foo: "bar" 

có thể được truy cập như thế này:

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

này là an toàn và dễ quản lý, chưa kể đến thực hành tiêu chuẩn.


Như để làm cho các tập tin không thể tiếp cận, đó là một vấn đề điều hành cấp hệ thống mà không thể được giải quyết mà không thông tin về môi trường, hệ điều hành, thiết lập, vv

+0

Tại sao tôi không nên sử dụng đánh giá sự tò mò? –

+0

Tại sao không sử dụng eval từ tệp do người dùng cung cấp thực sự là do rủi ro liên quan. Có khá nhiều thông tin về điều này trên internet. Và có lẽ ở đây trên SO. Hoặc trao đổi bảo mật. – vgoff

+0

Điều này cũng đơn giản là không giải quyết phần biến môi trường của câu hỏi. – vgoff

1

Mục đích của một biến địa phương là được sử dụng tạm thời trong một định nghĩa phương thức hoặc một khối. Sử dụng nó bên ngoài môi trường như vậy, đặc biệt là trên các tập tin đánh bại mục đích của nó. Bạn không cần phải làm điều đó, và Ruby không có một cách đơn giản để làm điều đó.

Nếu bạn đang sử dụng các biến một cách chính xác và muốn chia sẻ các biến giữa các tệp, đó phải là các loại biến khác như biến thể, lớp hoặc toàn cục. Hoặc, với mục đích thiết lập môi trường, bạn nên sử dụng hằng số. Trong số đó, các biến toàn cầu và hằng số có thể được viết trong một tệp, được tải trong một tệp khác và được sử dụng.

file-a.rb

$foo = 1 
FOO = 2 

file-b.rb

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

Đối với các biến dụ và lớp, họ thuộc về một lớp hoặc một thể hiện của nó, vì vậy họ cần phải được xác định trong môi trường như vậy. Và bạn có thể mở lại cùng một lớp trong một tệp khác và tải nó trong một tệp khác.

tệp-a.rb

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

file-b.rb

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

Điều đó có ý nghĩa, tôi đã cố gắng giữ mật khẩu và như vậy trong chương trình của tôi và đó là lý do tại sao tôi đã cố gắng tải chúng theo cách đó. Đây chỉ là một kịch bản và tôi không có kế hoạch để có bất kỳ lớp học nào trong đó –