2012-04-30 9 views
8

コードエラー「非絶対家」:問題のSSH

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

これは、「非絶対的な家」を返します。実際、 'user'にはホームディレクトリがあります。提案されたアプローチの1つは、〜/ .ssh/configをIdentityFileへの完全なパスで変更することでした。これは問題を解決しませんでした。

これは、irbやconsoleを使って呼び出すとコードがうまく動作するということです。私たちが(同じコードを持つ)クラスメソッドの中から呼び出そうとすると、 "絶対的でない"エラーが返されます。

「ユーザー」は、問題なくコマンドライン経由でサーバーにsshすることもできます。サーバーはUbuntuを実行しています。 @Phrogzへ

UPDATE

おかげ - これのための修正は '/ホーム/デプロイ' にENV [ 'HOME']を設定しました。しかし、なぜ$ HOMEが "。"に設定されているのか分かりません。サーバー上でだから、私は誰か他の人がそれを理解するまで、この質問を「回答」なしで残しておきます。手動でホームを設定することは、適切な解決策よりも「ハック」のように感じますが、機能します。

+1

'HOME'環境変数がありますか? 'echo $ HOME' – Phrogz

+1

@Phrogz - irb、コンソール、コマンドラインから出力すると、パスが表示されます。しかし、クラス(home =%x [echo $ HOME])の変数(Rails_Root/lib/class_obj)に変数を設定すると、 "。 – Jadon

+1

インタプリタが別のパスを持つシェルの下で実行されているようです。スクリプト内の絶対パスに設定するか、完全に設定を解除すると、修正されますか? – Phrogz

答えて

0

Linuxは/etc/passwdファイルに基づいてこの情報を設定します。

deployerユーザーの場合、/etc/passwdに存在するものを確認してください。それはリストの一番下にあるはずです。

項目はコロンで区切られています。 ENV['HOME']の値は、その行の最後の2番目の値にする必要があります。

空白ですか、つまり2つのコロンを使用していますか?

あなたのHOME変数が/etc/passwdに存在せず、デフォルトのドットファイルの1つ、つまり.bashrcのように設定されていると思われます。あなたのアプリケーションがドットファイルのソースではないinit.dスクリプトによって実行されている場合、.bashrcは短絡します。 (多くの.bashrcファイルは、非対話型シェル経由で実行されるコマンドの残りの部分のロードを停止します)。

ご希望の場合は、この情報を参考にしてご返信ください。

+0

私は/ etc/passwdに適切に設定された状態で、同様の問題を抱えています。 – trimbletodd

1

HOME ENV varが設定されていない場合は、間違いなくこれを設定して動作します。

2

同じ問題が発生したため、根本的な原因が見つかりました。スクリプトをサービスとして実行しています。サービスのマンページを確認すると、HOMEを含むスクリプトを実行する前に、ほとんどのenv変数が削除されます。あなたのシナリオが同じかどうかわかりませんが、HOMEは設定されていません。

net-sshはユーザのホームフォルダからssh configを検索したいのでENV ['HOME']を強制的に "。"にします。それが設定されていない場合。しかし、File.expand_pathが "〜/ .ssh"を展開しようとすると、ArgumentErrorが発生します。

これは2か月前に修正されました(https://github.com/net-ssh/net-ssh/pull/98)ので、net-ssh gemを更新するとこれが解決されます。