web-dev-qa-db-ja.com

シェルスクリプトでユーザーを変更し、環境全体を読み込む

ユーザーを変更していくつかのRubyデーモンプロセスを起動する、私たちのupstartスクリプトに問題があります。

以前は、_bash -c "do the business" -l someuser_フラグを使用してログインをエミュレートするようにして、単に_-l_を使用していました。

これはこれまでうまく機能しており、Rubyプロセスが次のエラーをスローしています:require: no such file to load -- rubygems (LoadError)調査の結果、このエラーは、スクリプトをルートとして実行したときにのみ発生することがわかりましたユーザー、つまり(私が_Sudo su_のとき、またはupstartによって実行されているとき)。

最初にパスを手動で設定すると問題が解決するため、これはPATHの問題だと思います。

ユーザーを変更して全体環境をロードする方法はありますか?

_su user -c_とSudoも試しました。


テストを簡単にするために、私は "ルート化"(_Sudo su_)し、_which bundle_を実行しています(バンドルはRubyのことです)。

ここに私が得るものがあります:

  • _Sudo -i -u webuser which bundle_#=>出力なし
  • _su -l webuser -c which bundle_#=>出力なし
  • _Sudo su - webuser -c which bundle_#=>出力なし

しかし、sshはwebuserとして

  • _which bundle_#=>/opt/Ruby/bin/bundle
8
Daniel Upton

Sudo su - user -cを使用すると、パスを継承する人としてログインしたようになります。そのため、su usersu - userとは異なります。

ただし、.bashrcファイルにパスを設定している場合は、インタラクティブセッション(つまり、そのユーザーとしてsshでログイン)に対してのみ有効です。

代わりに.bash_profileまたは/etc/profileを使用する必要があります。 this を参照してください。

9
Nate

ログインコンテキストには、次のいずれかを使用します。

  • Sudo -i -u USER COMMAND
  • su -l USER -c COMMAND
3
H.-Dirk Schmitt