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


9

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

以前bash -c "do the business" -l someuserは、-lフラグを使用してログインをエミュレートすることを確認するだけでした。

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

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

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

私も試してみましたsu user -csudo


テストを簡単にするために、私は「ルート化」(sudo su)して実行していますwhich bundle(バンドルはルビーです)。

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

  • 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

1
試しましたsu - user -cか?
Karlson、2012

それはどのような分布ですか?
artistoex

スクリプトは、ユーザーごとにインストールされたRubyモジュールに依存していますか?
キース

@artistoexそれはubuntuです:)
Daniel Upton

1
それが本当にPATHの問題であることを確認します(スクリプトの変数をダンプします)。そして、パスとを見て比較/etc/profile ~/.bash_profile ~/.bash_loginして~/.profile。ログインシェルの場合、bashはこれらを指定された順序で評価します。
artistoex 2012

回答:


10

を使用sudo su - user -cすると、パスを引き継いだその人としてログインしたかのようになります。これがとsu userは異なる理由ですsu - user

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

代わりに.bash_profileまたはを使用して/etc/profileください。これを参照してください。


3
あなたはそれを注意しなければならないsu -su -l同義です。
ヨルダン2012

3
おそらく--login読みやすさをお勧めします。

3

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

  • sudo -i -u USER COMMAND
  • su -l USER -c COMMAND
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.