2012-04-30 42 views
8

問題錯誤「非絕對的家」通過網:SSH

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

這將返回「非絕對的家」的代碼。 '用戶'實際上有一個主目錄。一種建議的方法是使用IdentityFile的完整路徑修改〜/ .ssh/config。這並沒有解決問題。

這個瘋狂的部分是,如果通過irb或控制檯調用,代碼工作正常。當我們嘗試從類方法(使用相同的代碼)中調用它時,它會返回「非絕對主頁」錯誤。

'用戶'也可以通過命令行ssh進入服務器,沒有問題。服務器運行Ubuntu。

UPDATE

感謝@Phrogz - 這樣做的修復程序設置ENV [ 'HOME']爲 '/家庭/部署'。不過,我還沒有弄清楚爲什麼$ HOME被設置爲「。」。在服務器上。所以,我會在沒有「回答」的情況下回答這個問題,直到我或其他人都能解決這個問題。不得不手動設置HOME感覺更像是一種「黑客」,而不是一個適當的解決方案,但它確實有效。

+1

你有一個'HOME'環境變量集嗎? 'echo $ HOME' – Phrogz

+1

@Progroz - 如果我通過irb,console,command line輸出它會顯示一條路徑。但是,如果我在類中設置了一個變量(home =%x [echo $ HOME])本身(Rails_Root/lib/class_obj),那麼它會以「。」打回我? – Jadon

+1

看起來你的解釋器在一個不同路徑的shell下運行。如果您在腳本中將其設置爲絕對路徑,或者將其完全取消設置,那麼是否解決了這個問題? – Phrogz

回答

0

Linux根據/etc/passwd文件設置此信息。

檢查用戶deployer/etc/passwd中存在什麼。它應該靠近列表的底部。

這些項目是冒號分隔的。 ENV['HOME']的值應該是該行中倒數第二位的值。

它是空白的,即有兩個冒號在一起?

我懷疑你的HOME變量沒有出現在/etc/passwd中,並且正在設置一個默認點文件,即類似於.bashrc。然後,.bashrc會短路,如果您的應用程序正在通過不會獲得您的點文件的init.d腳本運行。 (如果通過非交互式shell執行的話,許多.bashrc文件將停止加載剩餘的命令)。

希望這可以幫助,並請回發您的發現。

+0

我遇到了類似的問題,在/ etc/passwd中正確設置了主目錄。 – trimbletodd

1

它肯定通過設置HOME env var如果沒有設置。

2

我們剛碰到同樣的問題,找到了根本原因。我們將腳本作爲服務運行,如果您檢查手冊頁以獲取服務,它將在運行腳本之前剝離大多數env變量,包括HOME。我不知道你的情況是否相同,但是HOME沒有設置。

net-ssh希望從用戶主文件夾中查找ssh配置,因此它用於強制ENV ['HOME']爲「。」。如果沒有設置。但是,當File.expand_path嘗試展開「〜/ .ssh」時,引發了ArgumentError。

這是兩個月前修復的(https://github.com/net-ssh/net-ssh/pull/98),所以更新你的net-ssh gem應該可以解決這個問題。