我有 ubuntu 8.04,我想编写一个root
每个用户都可以运行的 bash 脚本。
我自己可以执行 sudo。
我怎么做?
澄清:我不想使用 sudo 来执行此操作,因为这样用户就必须输入密码。我只想让他们以 root 身份运行脚本,也许是 setuid 之类的,不知道。
答案1
如果这是一个普通的二进制文件,你可以通过运行 setuid
# chmod u+s /path/to/binary
不幸的是,脚本不能被 setuid。(你可以,但它被忽略了)。原因是脚本的第一行告诉操作系统在哪个解释器下运行脚本。例如,如果你有一个脚本:
#!/bin/bash
你最终会跑
/bin/bash /path/to/script
显然,你需要将解释器设置为 setuid,这意味着所有脚本都将被设置为 setuid。这很糟糕。
您可以通过运行 visudo 将以下内容放入 /etc/sudoers 文件中,使用 sudo 来执行此操作。
ALL ALL=NOPASSWD: /path/to/script
现在任何用户都可以运行
$ sudo /path/to/script
这使得他们无需输入密码即可运行脚本。
有一种替代方法不需要在命令中使用 sudo,它需要创建一个执行脚本的小型 setuid 二进制文件,但每个额外的 setuid 二进制文件都会增加另一个潜在的安全问题。
答案2
我需要插入那行在最后/etc/sudoers:ALL ALL = NOPASSWD: <filename>
显然,后来的%admin ALL=(ALL) ALL
覆盖需要管理员用户的密码。
只要脚本执行了精心策划的、无害的、允许的操作,并且任何参数的值不会导致脚本出现异常,那么允许脚本以 root 身份运行就不会存在安全问题。
但有一个问题...
始终在命令和文件名中使用完整路径。如果您echo Hello world!
在 中写入类似 的内容myrootscript
,则有人可能会写入~/bin/echo script
并myrootscript
以 root 身份执行其中的任何内容。
/bin/echo "Hoping this will keep you safe"
:-)
答案3
默认情况下,组成员wheel
被允许以sudo
身份执行任何命令。这可能是您迄今为止的root
使用方式。sudo
要允许其他用户,您需要创建一条sudoers
规则。例如:
mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh
将允许用户mickey.mouse
运行该命令/usr/local/bin/test.sh
而不root
需要额外的密码提示。
你应该读这个文件了解更多信息。
答案4
另一种选择:你可以围绕该脚本做一个小型的 setuid C 包装器
- 检查您可能想要强制执行的任何限制(用户列表、时间、系统负载......)
- 如果需要,记录/审计执行情况
- 执行脚本
有点像您自己的多种功能的子集sudo
。