2013-08-03 9 views
6

Czy istnieje sposób na odczyt w pliku zmiennych środowiskowych?Czytanie zmiennych z pliku w Ruby

W bash Mam plik env.sh które można używać

env.sh

foo="bar" 

plik bash

set -a 
source env.sh 

Pozwoliłoby to mnie po prostu użyć foo jakby Zrzuciłem go ze skryptu rubinowego.

Czy jest tam również sposób, aby upewnić się, że ten plik jest nieczytelny, aby hasła mogły być przechowywane w tym pliku?

+0

Parsowanie pliku par nazwa/wartość jest łatwe. Co próbujesz? Chcesz, aby plik stał się nieczytelny dla kogo? –

+0

@tinMan Nie próbowałem jeszcze nic do pliku, zrobiłem szybkie wyszukiwanie google i nic nie pasowało dokładnie to, czego szukałem, dlatego zapytałem, czy to było możliwe i nieczytelne dla każdego, kto nie jest właścicielem plik –

Odpowiedz

4

Brzmi jak powinien podać przykładowy plik dla użytkownika/admin zmodyfikować dla ich osobistego środowiska, a następnie wypełnić środowiska przed tym, gdy unikanie, być może, posiadania tego pliku z poufnymi informacjami w repozytorium. Uwaga: na bezpieczeństwo plików będzie adresowane miejsce, w którym znajduje się plik, system operacyjny i oprogramowanie serwera.

W takim przypadku można udostępnić plik zawierający szablon elementów wymaganych przez administratora/użytkownika programu, który konfigurujesz.

Ruby ma stałą ENV, która działa jak Hash i utrzymuje otoczenie powłoki, z której korzystasz.

Jako przykład istnieje plik o nazwie environment.rb.sample, który jest udostępniany publicznie. Ma instrukcje i szablon, który użytkownicy mogą dowolnie modyfikować, wraz z instrukcjami kopiowania pliku do environment.rb. Przykładowy plik wygląda tak:

# 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 

plik jest kopiowany do tego, być może:

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

plik, który ładuje to i wykorzystuje to tylko plik Ruby, który jest swobodnie modyfikowane przez użytkownik/administrator oprogramowania i wygląda tak, a także jest udostępniany publicznie.

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

To ładuje plik i używa ENV który jest globalnie scoped stała dla danej aplikacji.

Uprawnienia do plików są następnie zarządzane przez użytkownika/administratora systemu i zabezpieczane tak jak wszelkie inne poufne informacje w ich systemie. Wrażliwy plik powinien być również wymieniony w mechanizmie ignorowania repozytorium. Nigdy nie powinien być upubliczniany.

0

Tak, istnieje, a jeśli z jakiegoś bizzare, tajemnej powodu należy go używać, to eval:

UWAGA: Nie używaj tego, chyba że masz naprawdę dobry powód

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

Jeśli naprawdę chcesz zrobić, to napisz plik konfiguracyjny, użyj YAML. Plik ten sposób:

config.yaml:

foo: "bar" 

Może być dostępna tak: nie

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

Jest to bezpieczne i łatwe do opanowania, wspominając standardową praktyką.


Jak dokonywania plik niedostępne, które jest problemem na poziomie systemu operacyjnego, które nie mogą być rozwiązane bez informacji o środowisku, OS, konfiguracja itp

+0

Dlaczego nie powinienem używać eval z ciekawości? –

+0

Dlaczego nie używać eval z pliku dostarczonego przez użytkownika jest w rzeczywistości z powodu związanego z nim ryzyka. Istnieje sporo informacji na ten temat w Internecie. I prawdopodobnie tutaj na SO. Lub Security Exchange. – vgoff

+0

To również po prostu nie adres części zmiennej środowiskowych pytanie. – vgoff

1

Celem zmiennej lokalnej jest do użycia tymczasowego w definicji metody lub bloku. Używanie go poza takimi środowiskami, szczególnie w przypadku plików, jest sprzeczne z jego przeznaczeniem. Nie powinieneś tego robić, a Ruby nie ma prostego sposobu na zrobienie tego.

Jeśli używasz zmiennych poprawnie i chcesz udostępniać zmienne między plikami, powinny to być inne typy zmiennych, takie jak instancja, klasa lub zmienne globalne. Lub, w celu ustawienia środowisk, powinieneś używać stałych. Wśród nich zmienne globalne i stałe można zapisać w pliku, załadować do innego pliku i wykorzystać.

plików a.rb

$foo = 1 
FOO = 2 

plików b.rb

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

Jak dla instancji klasy i zmiennych, które należą do klasy lub instancji, więc powinny one być zdefiniowane w takim środowisku. Możesz ponownie otworzyć tę samą klasę w innym pliku i załadować ją do innego pliku.

plik-a.rb

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

plików b.rb

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

To ma sens, próbowałem zachować hasła i takie z mojego programu i dlatego próbowałem załadować je w ten sposób. To tylko scenariusz i nie planuję, aby miał w nim jakieś zajęcia –