sudo sudoはありません。これはスクリプトにsudoがあることを意味します。

sudo sudoはありません。これはスクリプトにsudoがあることを意味します。

設計上、sudo権限を必要とするいくつかの機能を含むいくつかのスクリプトを作成しました。どこからでも呼び出せるように、.bashrcforLinuxとfor.bash_profileにこれらのパスを追加しました。MacOS

sudoただし、ユーザーがこれらのスクリプト関数を呼び出すたびに入力したくありません。sudoこれらの関数が呼び出されるたびに端末がrootユーザーから呼び出されていると仮定することを暗示する方法はありますか?

sudo -iスクリプトの先頭に追加する必要があると思いますか、それとも各関数の先頭に追加する必要がありますか?それとも別の代替ヒントがありますかsudo?また、sudoを暗示するのが悪かったり危険だと思ってお勧めしない場合は、お知らせいただきありがとうございます。

dangerous-function指定せずに実行したい機能の一部を含むスクリプトの例sudo

#!/bin/bash
start-one()
{
    ## do dangerous stuff with sudo
    systemctl start dangerous.service
}

start-two()
{
    systemctl start dangerous1.service
}

start-launchwizard()
{
    systemctl start dangerous2.service
}

## Calling functions one by one...
"$@"

私は彼らに電話したくないだけでsudo dangerous-function start-one 電話したいのですが、dangerous-function start-oneそれでも以前と同じ結果が得られます。

ベストアンサー1

"$@"個別に引用されたコマンドライン引数のリストに展開されます。つまり、次のようにスクリプトを呼び出すと

./script.sh start-one

その時点で実行されますstart-one(これはあなたの機能です)。それ返品と呼ぶという意味だ。

./script.sh ls

実行されますls

sudoユーザーが呼び出しスクリプトを使用(またはsudoスクリプト内で使用)できるようにしたsudo場合は、アクセス権がある場合はrootとしてすべてのコマンドを実行できます。あなたはこれをしたくありません。

代わりに、コマンドラインパラメータを慎重に確認する必要があります。たぶん良い

foo_func () {
    # stuff
    printf 'foo:\t%s\n' "$@"
}

bar_func () {
    # stuff
    printf 'bar:\t%s\n' "$@"
}

arg=$1
shift

case $arg in
    foo)
        foo_func "$@" ;;
    bar)
        bar_func "$@" ;;
    *)
        printf 'invalid sub-command: %s\n' "$arg" >&2
        exit 1
esac

テスト:

$ sh script.sh bar 1 2 3
bar:    1
bar:    2
bar:    3
$ sh script.sh baz
invalid sub-command: baz

これは〜になりますより安全と一緒に使用しますsudoが、まださまざまな機能でユーザーが提供するものを実行したくありません。まっすぐ入力内容を整理する必要はありません。上記のスクリプトは、ユーザーを特定のサブコマンドのセットに制限することによってこれを行います。サブコマンドを処理する各関数は、次のことを行います。いいえevalまたは、対応するパラメータを実行しますsource

言い換えれば、そうです。スクリプトは何らかの方法でユーザー入力をコードで実行せず、試してはいけません。。引数が現在の環境で実行できる関数に対応しているかどうかを判断しないでください(関数は呼び出し環境によってそこに配置されている可能性があります)、パス名は現在の環境に提供されているスクリプトを実行しないでください。コマンドラインなど

スクリプトが管理タスクを実行している場合は、次のように実行したいとsudo思います。スクリプト自体特に、非対話型(cronジョブなど)で実行するスクリプトの場合は、パスワードを求めます。つまり、root権限を必要とする管理タスクを実行するスクリプトは、(IMHO)以下を実行できる必要があります。考える最初から正しい権限で実行されます。

欲しいならテストスクリプトでは、次のことができます。

if [ "$( id -u )" -ne 0 ]; then
    echo 'please run this script as root' >&2
    exit 1
fi

それから決定を下すどのようにスクリプト ユーザーとして root 権限でスクリプトを実行します。

おすすめ記事