私は、スクリプトを実行するときにスクリプトを実行する前に、そのユーザーにsuを要求せずに特定のユーザーとして実行するように努めています。スクリプトは、次のようないくつかのフラグで実行されます。
./myscript.sh -e dev -v 1.9
私は次を試しました
[ `whoami` = myuser ] || exec sudo -S su - myuser -c "bash `pwd`/`basename $0` $@"
しかし、-vフラグは私のスクリプトに入力する必要がありますが、suへの入力として使用されています。だから、間違ったオプションについて文句を言う。上記の問題を解決する方法はありますか?
注:スクリプトを実行している人にはsudo権限があります。
答え1
現在、ユーザーはすでに変数にあります$USER
。したがって、必要なものは次のとおりです。
[ "$USER" = "myuser" ] || sudo -u myuser $0 "$@"
不要の場合は、sudo su
必要なsudo
操作をすべて実行できます。必要ないか、pwd
変数basename
には$0
すでにスクリプトへのフルパスがあります。
元のコマンドはログインシェル(su -
)を起動することでした。本当に必要な場合(不思議ですが)、次のようにできます。
[ "$USER" = "myuser" ] || sudo -iu myuser $0 "$@"
答え2
スクリプトには2つの問題があります。
1)テストコマンドでスペースを忘れてしまいました。[`whoami` = myuser]
2) 変数 "$@" が 2 つのステップに拡張されるため、参照は失われます。
私のシステムでは、次のように動作するようです。
[ `whoami` = myuser ] || exec sudo -S -u myuser bash -- "$0" "$@"
答え3
もしフルスクリプトsu
特定のユーザーが実行する必要があり、スクリプトを実行しているユーザーに適していると判断されるように(sudo
または他の方法で)正しいユーザーIDに変更するように依頼します。
これにより、スクリプトが簡素化され、使いやすくなります。特に、ユーザーが正しい身元を推測できない状況を「修正」する必要はありません。個人的には、これを正しいコマンドラインオプションを使用できなかったのと同様の呼び出しのバグとして見ます。
明らかに、スクリプトは正しいユーザーが実行していることを確認できます。
if [ "$USER" != "correctuser" ]; then
echo 'Must be run by "correctuser"' >&2
exit 1
fi
一般ユーザーは次のようにスクリプトを実行します。
sudo -u correctuser ./script.sh -e dev -v 1.9
そしてrootユーザーは次のことを望むかもしれません。
su correctuser -c ./script.sh -e dev -v 1.9