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

有没有办法让 shebang 线像这样

#!/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

一种解决方案是使用包装脚本:make /home/alice/script.shcontains

#!/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而不是直接运行脚本。您可以提供 shell 别名、.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

# ...

相关内容