2013-08-03 9 views
6

C'è un modo per leggere in un file di variabili di ambiente?Lettura in variabili da un file in Ruby

In bash ho un env.sh di file che posso usare

env.sh

foo="bar" 

file di bash

set -a 
source env.sh 

Ciò mi permette di utilizzare proprio come se foo L'avevo delcared nella sceneggiatura ruby.

C'è anche un modo per assicurarsi che questo file sia illeggibile in modo che le password possano essere memorizzate in questo file?

+0

L'analisi di un file di coppie nome/valore è facile. Che cosa hai provato? E vuoi rendere il file illeggibile a chi? –

+0

@theTinMan Non ho ancora provato nulla per il file, ho fatto una rapida ricerca su google e nulla corrispondeva esattamente a ciò che stavo cercando, ecco perché ho chiesto se fosse possibile e illeggibile a chiunque non fosse il proprietario del file –

risposta

4

Suona come si dovrebbe fornire un esempio di file per l'utente/amministratore di modificare per il loro ambiente personale, e quindi popolare l'ambiente da che, pur evitando, forse, di avere quel file con le informazioni sensibili in un repository. Nota: per sicurezza del file verrà indirizzata da dove si trova il file e il sistema operativo e il software del server.

In tal caso, è possibile fornire un file contenente un modello del tipo di cose che si richiederebbero all'amministratore/utente del programma che si sta configurando.

Ruby ha la costante ENV che si comporta come un Hash e contiene l'ambiente della shell che si sta utilizzando.

Ad esempio, esiste un file denominato environment.rb.sample che viene condiviso con chiunque, pubblicamente. Ha istruzioni e contiene il modello che gli utenti possono modificare liberamente, con le istruzioni per copiare il file su environment.rb. Il file di esempio è simile al seguente:

# 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 

Il file viene quindi copiato questo, forse:

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

Il file che carica questo e lo utilizza è solo un file di Ruby, che è liberamente modificato dal utente/amministratore del software, e appare come questo ed è anche condiviso pubblicamente.

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

Questa carica il file e utilizza la ENV cioè un ambito globale costante per l'applicazione.

Le autorizzazioni di file vengono quindi gestite dall'utente/amministratore del sistema e protette come qualsiasi altra informazione sensibile sul proprio sistema. Il file sensibile dovrebbe anche essere elencato nel meccanismo di ignoranza del repository. Non dovrebbe mai essere reso pubblico.

0

Sì, c'è, e se per qualche bizzarra, ragione arcana è necessario utilizzare esso, è eval:

ATTENZIONE: Non usare questo a meno che non si dispone di un davvero, davvero buona ragione

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

Se ciò che si sta tentando di fare è scrivere un file di configurazione, utilizzare YAML. Un file in questo modo:

config.yaml:

foo: "bar" 

si può accedere in questo modo: non

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

Questo è sicura e gestibile, per citarne pratica standard.


quanto per rendere il file inaccessibile, che è un problema di funzionamento a livello di sistema che non può essere risolto senza informazioni sull'ambiente, sistema operativo, configurazione, ecc

+0

Perché non dovrei usare la valutazione per curiosità? –

+0

Perché non utilizzare eval da un file fornito dall'utente è in realtà dovuto al rischio. C'è un bel po 'di informazioni su questo su internet. E probabilmente qui su SO. O Scambio di sicurezza. – vgoff

+0

Anche questo semplicemente non affronta la parte variabile della domanda di ambiente. – vgoff

1

Lo scopo di una variabile locale è da utilizzare temporaneamente all'interno di una definizione di metodo o di un blocco. Usarlo al di fuori di tali ambienti, in particolare tra i file, ne sconfigge lo scopo. Non dovresti aver bisogno di farlo, e Ruby non ha un modo semplice per farlo.

Se si utilizzano le variabili in modo corretto e si desidera condividere le variabili tra file, è necessario che siano presenti altri tipi di variabili quali istanza, classe o variabili globali. Oppure, ai fini dell'impostazione degli ambienti, dovresti utilizzare le costanti. Tra questi, le variabili globali e le costanti possono essere scritte in un file, caricate in un file diverso e utilizzate.

file a.rb

$foo = 1 
FOO = 2 

file b.rb

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

come ad esempio di classe e variabili, essi appartengono a una classe o un'istanza di esso, in modo che dovrebbe essere definito in tale ambiente. E puoi riaprire la stessa classe in un altro file e caricarla in un altro file.

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

Questo ha senso, stavo cercando di mantenere le password e così via dal mio programma ed è per questo che stavo cercando di caricarle in quel modo. Questo è solo uno script e non sto pianificando di avere classi in esso –