設計上、sudo権限を必要とするいくつかの機能を含むいくつかのスクリプトを作成しました。どこからでも呼び出せるように、.bashrc
forLinux
と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 権限でスクリプトを実行します。
答え2
/etc/sudoers
ユーザーがアクセスできるようにスクリプトを追加できます(好ましくは「visudo」を使用)。
user ALL= /path/to/script
これにより、ユーザーはsudoなしで実行できますpath/to/script
。