3つの機能を実行するスクリプトがありますA && B && C
。
この関数はB
スーパーユーザーとして実行する必要がありますが、そうではありませA
んC
。
いくつかの解決策がありますが、それらのどれも満足できません。
スクリプト全体をsudoしてください。
sudo 'A && B && C'
必要でない場合、スーパーユーザーとして
A
実行するのは悪い考えのようです。C
スクリプトをインタラクティブにします。
A && sudo B && C
パスワードを入力する必要があるかもしれませんが、各機能に時間がかかり、スクリプトが私を待たないため、スクリプトは非対話型であることを望みます。まあ、それが当初スクリプトだから実行されるのを見る必要がない理由です。
愚かな解決策:
sudo : && A && sudo -n B && C
まず、最初に無作為に実行するのは愚かなよう
sudo
です$sudo_timeout
。仮説的な解決策(それが存在すると言ってください):
sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'
最初はパスワードの入力を求められ、必要なときにのみ資格情報を使用します。
これらすべてについてどう思いますか?非常に一般的な問題だと思ったので、この問題に対する解決策がないという事実に驚きました(それはいかがですかmake all && sudo make install
)。
答え1
パスワードを要求せずに実行できるようにするには、/etc/sudoers
この属性を持つファイルにスクリプトを追加します。NOPASSWD
特定のユーザー(またはユーザーグループ)にバインドしたり、sudo
システム内のすべての人が実行できるようにすることができます。
名前付きスクリプトのサンプル行は/usr/local/bin/bossy
次のとおりです。
ALL ALL = (root) NOPASSWD: /usr/local/bin/bossy
その後、次のようなものを使用します。
A && sudo bossy && C
PATH
この例ではincludeと仮定します/usr/local/bin
。そうでない場合は、スクリプトのフルパスを使用してください。sudo /usr/local/bin/bossy
答え2
あなたができる最善の方法は、起動スクリプトを使用してから、またはsudo
次を使用して一般ユーザーとして実行したいプロセスを明示的に開始することです。su user
sudo -u user
#!/usr/bin/env bash
## Detect the user who launched the script
usr=$(env | grep SUDO_USER | cut -d= -f 2)
## Exit if the script was not launched by root or through sudo
if [ -z $usr ] && [ $UID -ne 0 ]
then
echo "The script needs to run as root" && exit 1
fi
## Run the job(s) that don't need root
sudo -u $usr commandA
## Run the job that needs to be run as root
commandB
答え3
!requiretty
このオプションsudo
だけでなく、このオプションも使用できますNOPASSWD
。しかし、これはセキュリティが低下することに注意してください。
答え4
愚かなように転がしてください。多くの行を使用してください。
if A; then
if sudo B ; then
C
fi
fi