QA@IT

capistrano使用時とsshログイン時とで環境変数が異なってしまう

5703 PV

提題のとおりですが、capistrano経由と、普通にsshログインした時とで環境変数が異なってしまいます。
使用しているユーザーはどちらもrootで同じなのですが、何故異なってしまうのか?がわかりません。

原因が不明なため、現在はdefault_environmentを使用して後から設定することで対応しています。
サーバー上で起動する場合はこれらの環境変数が設定済みとなっていますが、
capistrano経由だとdefault_environmentに定義しないとそれぞれパスが見つかりませんと言われてしまいます。

set :default_environment, {
  'PATH' => "/usr/local/rvm/gems/ruby-1.8.7-p352@xxxxx/bin:/usr/local/rvm/bin::$PATH",
  'RUBY_VERSION' => 'ruby 1.8.7',
  'GEM_HOME'     => '/usr/local/rvm/gems/ruby-1.8.7-p352@xxxxx',
  'GEM_PATH'     => '/usr/local/rvm/gems/ruby-1.8.7-p352@xxxxx:/usr/local/rvm/gems/ruby-1.8.7-p352@global',
  'BUNDLE_PATH'  => '/usr/local/rvm/gems/ruby-1.8.7-p352@xxxxx',  # If you are using bundler.
  'LANG' => "ja_JP.UTF-8",
  'R_HOME' => "/usr/lib/R",
  'JAVA_HOME' => "/usr/java/default"
}

環境
ruby 1.8.7
capistrano 2.14.2
Linux CentOS 5.6

以上、よろしくお願いします。

回答

SSHのConnectionプロトコルではセッションを開いた後、リモートでプログラムを実行させるときに、SSH_MSG_CHANNEL_REQUESTというメッセージでshell、exec、subsystemのいずれかをリクエストします。6.5. Starting a Shell or a Commandを参照。

「普通にsshログインした時」はSSH_MSG_CHANNEL_REQUESTでshellをリクエストするので、リモート側でユーザのログインシェルが割り当てられ、通常のログイン時の環境変数が設定された状態になります。

「capistrano使用時」はどうかというと、SSH_MSG_CHANNEL_REQUESTでexecをリクエストし、そのさいコマンドとしてsh -c '#{command}'を渡しているようです。これだとユーザのログインシェルが割り当てられないので、通常のログイン時の環境変数が設定されません。

ブログ記事Capistrano and Net:SSH with login shellが参考になります。

編集 履歴 (2)
  • 詳細な解説ありがとうございます。ブログ記事がとても参考になりました。 -

前に自分も同じようなことで困ったことがあって、その時はこんな感じで解決しました。もし参考になれば幸いです。

https://gist.github.com/riywo/4460408

sshなりbashなりは、ログインの状態が対話か非対話で色々と挙動が異なる場面があるんですよね。sshは最強のリモートエージェントかと思いきやそうでもなかったりするなーと思う次第です。

編集 履歴 (0)
  • ありがとうございます。gist、試してみたいと思います。 -

Capstranoで実行する際は
「シェルが起動されずbashrc等の設定は読み込まれない」と思います。
(Capstranoを使ったことが無いので推測です)

編集 履歴 (0)
  • ありがとうございます。そっちの線で調べてみます。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。