他のユーザー、そのユーザーだけでスクリプトを実行できるようにしたいです。
現在私が設定した方法は
alice ALL = (bob) NOPASSWD: /home/alice/script.sh
sudoersファイルから
alice@foo:~$ ls script.sh
-rwxr-xr-x 1 root root ..... script.sh
alice@foo:~$ lsattr script.sh
----i----------- script.sh
alice@foo:~$ head -1 script.sh
#!/bin/bash
alice@foo:~$ sudo -u bob ./script.sh
ok
シェバンラインをこのように作る方法はないでしょうか?
#!/usr/bin/sudo -u bob -- /bin/bash
アリスが逃げられるように
alice@foo:~$ ./script.sh
ok
?
これを試みると、エラーメッセージが表示されます。
sudo: unknown user: blog -- /bin/bash
sudo: unable to initialize policy plugin
答え1
Linux(他の多くのUnixバリアントと同様)は、スクリプトインタプリタへの単一の引数渡しのみをサポートします。 (インタプリタは shebang 行にあるプログラムです。) で始まるスクリプトは引数と を#!/usr/bin/sudo -u bob -- /bin/bash
呼び出して実行されます。/usr/bin/sudo
-u bob -- /bin/bash
/home/alice/script.sh
1つの解決策はラッパースクリプトを使用することです/home/alice/script.sh
。
#!/bin/sh
exec sudo -u bob /home/alice/script.real
そして、コードを/home/alice.script.real
始めに入れて#!/bin/bash
sudoルールで参照するようにしてください/home/alice.script.real
。
別の解決策は、スクリプトを独自に再実行させることです。必要な条件を正しく検出するように注意してください。そうしないと、無限ループが生成される危険があります。
#!/bin/bash
if ((EUID != 123)); then
exec sudo -u \#123 /home/alice/script.sh
fi
(ここで123はユーザーIDですbob
)
簡単な解決策は、人々にsudo -u bob /home/alice/script.sh
スクリプトを直接実行するのではなく実行するように指示することです。シェルエイリアス、.desktop
ファイルなどを提供できます。
答え2
エイリアスを試してください。
alias bobscript="sudo -u bob ./script.sh"
そして、以下を実行してください:
bobscript
答え3
スクリプト内でsudoを呼び出さない方が最善の方法かもしれませんが、簡単な方法はenv -S
shebang行により多くのパラメータを渡すことです。
#!/usr/bin/env -S /usr/bin/sudo -- /bin/bash
# ...
またはより小さい行の場合:
#!/usr/bin/env -S sudo bash
# ...