su ユーザー名 -c "./script.sh" と sudo -u ユーザー名 bash -c "./script.sh" と Java クラスパスの問題

su ユーザー名 -c

su usernameこれら2つのコマンドのいずれかを実行したときの環境が、ユーザーとしてコマンドを1つずつ使用し、実行したときの環境とどのように異なるのか疑問に思う奇妙な動作が見られます。

su username -c "cd /opt/scripts/ ; ./script.sh"

sudo -u username bash -c "cd /opt/scripts/ ; ./script.sh"

CentOS 6 Linuxサーバーのrootとしてinitスクリプトでこれらのコマンドを実行しました。

問題は、Javaプログラムを実行するscript.shファイルが(script.shが配置されている場所に相対的な)相対パス(たとえば、./classes/com:./lib/common)を持つクラスパスディレクティブを使用することです。指摘する必要があります。 )。ユーザー名をsuと入力して/opt/scriptsでcdして./script.shを実行すると機能しますが、スクリプトを実行する前にcdに移動してもスクリプト内のsuコマンドとsudoコマンドの両方でクラスが見つからないという問題があるようです。ディレクトリ。なぜですか? suを使用してユーザーになることとコマンドを1つずつ実行することの違いは何ですか?

ベストアンサー1

環境を比較してみてください。

$ sudo -s
# diff <(su username -c env) <(sudo -u username bash -c env)

たとえば、環境はデフォルトでから制御されますsudoenv_*/etc/sudoers

おすすめ記事