2013-08-03 18 views
6

Bir ortam değişkenleri dosyasında okunmanın bir yolu var mı? Bash olarakRuby'deki bir dosyadan değişkenleri okuma

Ben kullanabileceğiniz bir dosya env.sh var

env.sh

foo="bar" 

bash dosya

set -a 
source env.sh 

Bu bana sadece sanki foo kullanmasına izin vereceğini Ruby senaryosunda onu delirtmiştim.

Ayrıca, bu dosyanın okunamadığından emin olmanın bir yolu da bu dosyada parolaların saklanabilmesi için bir yol var mı?

+0

Ad/değer çiftleri bir dosya ayrıştırma kolaydır. Ne denedin? Ve dosyayı kim için okunamaz hale getirmek istiyorsun? –

+0

@theTinMan Henüz dosya için henüz bir şey denemedim, hızlı bir google araması yaptım ve hiçbir şey tam olarak aradığım şeyle eşleşmiyordu. Bu yüzden, bu yüzden mümkün olmayan ve okunamayan herkesin erişilip okunamayacağını sordum. dosya –

cevap

4

Bu süre, sesler Belki de bu dosyayı bir depodaki hassas bilgilerle birlikte kullanmaktan kaçınıyor. Not: Dosya güvenliği, dosyanın bulunduğu yere ve işletim sisteminize ve sunucu yazılımına göre adreslenir.

Böyle bir durumda, yapılandırmakta olduğunuz programın yöneticisi/kullanıcısından istediğiniz türden bir şablona sahip bir dosya sağlayabilirsiniz.

Ruby, Hash gibi davranan ve kullandığınız kabuğun ortamını tutan ENV sabitine sahiptir.

Örnek olarak, public.rb.sample adında herkesle paylaşılan bir dosya var. Talimatlar içerir ve kullanıcıların özgürce değiştirebileceği şablonu saklar ve dosyayı environment.rb'a kopyalama talimatlarını içerir. belki

# 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 

dosya daha sonra bu kopyalanır: örnek dosyada şöyle

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

bu yükler ve onu serbestçe tarafından değiştirilir sadece Ruby dosyası olduğunu kullandığı dosya yazılımın kullanıcısı/yöneticisi ve buna benzer ve aynı zamanda herkese açık olarak paylaşılır.

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

Bu dosyayı yükler ve global uygulama için sabit kapsamlı olduğunu ENV kullanır.

Dosya izinleri daha sonra sistem kullanıcısı/yöneticisi tarafından yönetilir ve sistemindeki diğer hassas bilgiler gibi güvenli hale getirilir. Hassas dosya ayrıca depodaki göz ardı etme mekanizmasında da listelenmelidir. Asla halka açık olmamalı.

0

Evet, var ve bunu kullanması gerekir bazı bizzare, gizli bir nedenle, bu eval ise:

UYARI: Gerçekten, gerçekten iyi gerekçe gösterdiler

eval(File.read("name_of_var_file"), binding) 
yoksa bunu kullanmayın

Gerçekten yapmaya çalıştığınız şey bir yapılandırma dosyası yazmaksa YAML'yi kullanın. Böyle bir dosya:

config.yaml:

foo: "bar" 

böyle erişilebilir Can:

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

Bu, güvenli ve yönetilebilir standart uygulamayı saymıyorum. dosya erişilemez hale gelince


, o çevreye bilgi olmadan çözülemez bir işletim sistemi düzeyinde sorun, işletim sistemi, kurulum, vb yerel bir değişkenin amacı

+0

Neden değerlendirmeyi meraktan kullanmamalıyım? –

+0

Neden kullanıcı tarafından sağlanan bir dosyadan eval kullanmıyorsunuz, bu risk nedeniyle oluşur. İnternette bunun hakkında biraz bilgi var. Ve muhtemelen burada SO. Veya Güvenlik Borsası. – vgoff

+0

Bu ayrıca sorunun çevre değişkenine de değinmez. – vgoff

1

olduğunu Bir yöntem tanımı veya bir blok içinde geçici olarak kullanılmak üzere. Bu gibi ortamların dışında, özellikle dosyalar arasında kullanmak, bunun amacını yitirir. Bunu yapmanıza gerek yok ve Ruby'nin bunu yapmanın basit bir yolu yok.

Değişkenleri doğru bir şekilde kullanıyorsanız ve değişkenler arasında dosya paylaşmak istiyorsanız, örnek, sınıf veya genel değişkenler gibi başka değişken türleri olmalıdır. Ya da, ortamların ayarlanması amacıyla, sabitleri kullanmalısınız. Bunlar arasında, global değişkenler ve sabitler, farklı bir dosyaya yüklenmiş, bir dosyaya yazılabilir ve kullanılabilir.

dosya a.rb

$foo = 1 
FOO = 2 

örnek ve sınıf değişkenleri için olduğu gibi dosya b.rb

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

, bir sınıf veya bunun bir örneğine ait, böylece olmalıdır bu ortamda tanımlanmış. Ve aynı sınıfı farklı bir dosyada yeniden açabilir ve başka bir dosyaya yükleyebilirsiniz.

dosya-a.Eğer kullanıcı/yönetici kendi kişisel çevre için değiştirmek için bir dosya örneğini sağlarsınız ve o çevreyi doldurmak gerektiği gibi rb

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

dosya b.rb

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

Bu mantıklı, şifrelerimi ve programımdan çıkmaya çalışıyordum ve bu yüzden onları bu şekilde yüklemeye çalışıyordum. Bu sadece bir betik ve içinde herhangi bir dersin olmasını planlamıyorum. –

İlgili konular