非対話型スクリプトのsudo

非対話型スクリプトのsudo

3つの機能を実行するスクリプトがありますA && B && C

この関数はBスーパーユーザーとして実行する必要がありますが、そうではありませAC

いくつかの解決策がありますが、それらのどれも満足できません。

  1. スクリプト全体をsudoしてください。sudo 'A && B && C'

    必要でない場合、スーパーユーザーとしてA実行するのは悪い考えのようです。C

  2. スクリプトをインタラクティブにします。A && sudo B && C

    パスワードを入力する必要があるかもしれませんが、各機能に時間がかかり、スクリプトが私を待たないため、スクリプトは非対話型であることを望みます。まあ、それが当初スクリプトだから実行されるのを見る必要がない理由です。

  3. 愚かな解決策:sudo : && A && sudo -n B && C

    まず、最初に無作為に実行するのは愚かなようsudoです$sudo_timeout

  4. 仮説的な解決策(それが存在すると言ってください):

    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 usersudo -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

関連情報