2012-04-30 18 views
8

Il codice in questioneerrore "a casa non assoluto" via rete: SSH

Net::SSH.start('server name', 'user') 

Ciò restituisce "casa non assoluto". L'utente ha infatti una directory home. Un approccio suggerito è stato quello di modificare ~/.ssh/config con percorsi completi per IdentityFile. Questo non ha risolto il problema.

La parte pazzesca di questo è che il codice funziona bene se viene chiamato tramite irb o console. Nel momento in cui proviamo a chiamarlo da un metodo di classe (con lo stesso codice) restituisce l'errore "casa non assoluta".

L'utente può anche ssh nel server tramite la riga di comando senza problemi. Il server sta eseguendo Ubuntu.

UPDATE

Grazie a @Phrogz - La correzione di questo è stato l'impostazione ENV [ 'HOME'] a '/ home/deploy'. Tuttavia, non ho capito perché $ HOME sia impostato su "." sul server. Quindi, lascerò questa domanda senza una "risposta" finché io, o qualcun altro, non lo capirò. Il dover impostare manualmente HOME sembra più un "trucco" che una soluzione adeguata, ma funziona.

+1

Avete impostato una variabile di ambiente 'HOME'? 'echo $ HOME' – Phrogz

+1

@Phrogz - se lo invio via irb, console, riga di comando mostra un percorso. Tuttavia, se lo imposto come variabile nella classe (home =% x [echo $ HOME]) stesso (Rails_Root/lib/class_obj), allora mi ritorna con un "."? – Jadon

+1

Sembra che l'interprete stia utilizzando una shell con un percorso diverso.Se lo si imposta su un percorso assoluto nel proprio script o se lo si disattiva completamente, lo risolve? – Phrogz

risposta

0

Linux imposta queste informazioni in base al file /etc/passwd.

Verificare l'esistente in /etc/passwd per l'utente deployer. Dovrebbe essere vicino alla fine dell'elenco.

Gli articoli sono separati da due punti. Il valore per ENV['HOME'] dovrebbe essere la penultima entrata in quella linea.

È vuoto, vale a dire avere due punti due insieme?

Sospetto che la variabile HOME non sia presente nello /etc/passwd e sia impostata su uno dei dotfile predefiniti, ad esempio .bashrc. Quindi, .bashrc viene cortocircuitato se la tua app è in esecuzione tramite uno script init.d che non fornisce i tuoi dotfile. (Molti file .bashrc interrompono il caricamento del resto dei comandi se viene eseguito tramite una shell non interattiva).

Spero che questo sia di aiuto e per favore postare le tue scoperte.

+0

Sto riscontrando un problema simile, con la casa impostata correttamente in/etc/passwd. – trimbletodd

1

Funziona sicuramente impostando HOME env var se non è impostato.

2

Abbiamo appena incontrato lo stesso problema e trovato la causa principale. Stiamo eseguendo il nostro script come servizio e, se si controlla la manpage per il servizio, questo rimuove la maggior parte delle variabili env prima di eseguire lo script, incluso HOME. Non so se il tuo scenario è lo stesso, ma HOME non è impostato.

net-ssh vuole cercare ssh config dalla cartella home dell'utente, quindi è stato utilizzato per forzare ENV ['HOME'] in "." se non fosse stato impostato. Ma quando File.expand_path prova ad espandere "~/.ssh" viene sollevato l'ArgumentError.

Questo problema è stato risolto due mesi fa (https://github.com/net-ssh/net-ssh/pull/98), pertanto l'aggiornamento della gemma net-ssh dovrebbe risolvere il problema.