shebangラインの `sudo -u user`

shebangラインの `sudo -u user`

他のユーザー、そのユーザーだけでスクリプトを実行できるようにしたいです。

現在私が設定した方法は

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/bashsudoルールで参照するようにしてください/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 -Sshebang行により多くのパラメータを渡すことです。

#!/usr/bin/env -S /usr/bin/sudo -- /bin/bash

# ...

またはより小さい行の場合:

#!/usr/bin/env -S sudo bash

# ...

関連情報