我有 ubuntu 8.04,我想编写一个 bash 脚本来运行root
,每个用户都可以运行它。
我自己可以做sudo。
我怎么做?
澄清:我不想用 sudo 来做,因为那样用户将不得不输入他们的密码。我只是希望他们以root身份运行脚本,也许是setuid,不知道。
我有 ubuntu 8.04,我想编写一个 bash 脚本来运行root
,每个用户都可以运行它。
我自己可以做sudo。
我怎么做?
澄清:我不想用 sudo 来做,因为那样用户将不得不输入他们的密码。我只是希望他们以root身份运行脚本,也许是setuid,不知道。
如果这是一个普通的二进制文件,你可以通过运行 setuid
不幸的是,脚本不能是 setuid。(嗯,你可以,但它被忽略了)。原因是脚本的第一行告诉操作系统在哪个解释器下运行脚本。例如,如果您有一个脚本:
你实际上最终会跑步
显然,您需要将解释器设置为 setuid,这意味着所有脚本都将设置为 setuid。这会很糟糕。
您可以使用 sudo 执行此操作,方法是通过运行 visudo 将以下内容放入您的 /etc/sudoers 文件中。
现在任何用户都可以运行
这允许他们在不输入密码的情况下运行脚本。
还有一种替代方法不需要命令中的 sudo,它需要创建一个小的 setuid 二进制文件来执行您的脚本,但是每个额外的 setuid 二进制文件都会增加另一个潜在的安全问题。
我需要在/etc/sudoers 的末尾插入该行:显然
ALL ALL = NOPASSWD: <filename>
,稍后的%admin ALL=(ALL) ALL
覆盖需要管理员用户的密码。只要脚本执行确定的、无害的、允许的操作,并且如果任何参数的值都不会导致脚本行为不端,就没有安全问题允许脚本以 root 身份运行。
但是有一个陷阱...
始终在命令和文件名中使用完整路径。如果您编写类似
echo Hello world!
in 的myrootscript
内容,则有人可能会编写 a~/bin/echo script
并myrootscript
以 root 身份执行其中的任何内容。/bin/echo "Hoping this will keep you safe"
:-)默认情况下,该
wheel
组的成员被允许使用sudo
任何命令作为root
. 这可能是您sudo
迄今为止的使用方式。要允许其他用户,您需要创建一个
sudoers
规则。例如:将允许用户在不需要额外的密码提示的情况下
mickey.mouse
运行命令。/usr/local/bin/test.sh
root
您应该阅读本文档以获取更多信息。
用于chmod +s <filename>
设置 suid 位。这意味着当文件被执行时,它以文件所有者的权限运行(因此将其更改为 root 以使其运行)。但是,对于 bash 脚本之类的东西,这可能非常危险,因为用户找到了更改它的方法,他们可以轻松获得 root shell。确保它不能被除 root 之外的任何人写入。Linux不允许您在脚本上设置uid,为此您必须将其编译为程序。相反,您可以使用 sudoers 文件 (/etc/sudoers),并添加这样的一行。
<username> ALL = NOPASSWD: /path/to/script
另一种选择:您可以围绕该脚本执行一个小的 setuid C 包装器
有点像您自己的
sudo
.