8

問題のコード

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

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

これのクレイジーな部分は、irb またはコンソールから呼び出された場合にコードが正常に機能することです。クラスメソッド内から(同じコードで)呼び出そうとすると、「非絶対ホーム」エラーが返されます。

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

アップデート

@Phrogz に感謝 - これに対する修正は、ENV['HOME'] を '/home/deploy' に設定することでした。しかし、なぜ $HOME が "." に設定されているのかわかりません。サーバー上。したがって、私または他の誰かがそれを理解するまで、「回答」なしでこの質問を残します. 手動で HOME を設定しなければならないというのは、適切な解決策というよりも「ハック」のように感じますが、うまくいきます。

4

3 に答える 3

2

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

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

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

于 2013-06-19T09:22:59.360 に答える
1

設定されていない場合は、HOME env var を設定することで確実に機能します。

于 2013-05-14T14:39:24.057 に答える
0

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

ユーザーの存在を確認し/etc/passwdますdeployer。リストの一番下にあるはずです。

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

空白ですか、つまり 2 つのコロンが一緒になっていますか?

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

これがお役に立てば幸いです。調査結果を投稿してください。

于 2012-12-26T21:36:53.740 に答える