我希望能够以另一个用户的身份运行脚本,并且只能以该用户的身份运行。
我目前进行此设置的方式是拥有
alice ALL = (bob) NOPASSWD: /home/alice/script.sh
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
有没有办法让shebang线像
#!/usr/bin/sudo -u bob -- /bin/bash
Run Code Online (Sandbox Code Playgroud)
这样爱丽丝就可以跑了
alice@foo:~$ ./script.sh
ok
Run Code Online (Sandbox Code Playgroud)
?
如果我尝试这个,我只会收到错误消息
sudo: unknown user: blog -- /bin/bash
sudo: unable to initialize policy plugin
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
并将代码放在/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
Run Code Online (Sandbox Code Playgroud)
(其中 123 是 的用户 ID bob)
一个简单的解决方案是告诉人们运行sudo -u bob /home/alice/script.sh而不是直接运行脚本。您可以提供 shell 别名、.desktop文件等。
| 归档时间: |
|
| 查看次数: |
2471 次 |
| 最近记录: |