ubuntu:让用户使用root权限运行脚本

我有Ubuntu 8.04,我想编写一个bash脚本,以root身份运行,每个用户都可以运行。

我自己可以做sudo

我怎么做?

澄清 :我不想用sudo来做,因为用户将不得不input他们的密码。 我只是希望他们以root身份运行脚本,也许是setuid,不知道。

如果这是一个正常的二进制文件,你可以通过运行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 

这使得他们可以在不input密码的情况下运行脚本。

在命令中还有一个不需要sudo的选项,它需要创build一个小的setuided二进制文件来执行脚本,但是每个setuid二进制文件都会增加另一个潜在的安全问题。

我需要在/ etc / sudoers的末尾插入那行: ALL ALL = NOPASSWD: <filename>显然,后来的%admin ALL=(ALL) ALL覆盖需要pipe理员用户的密码。

没有任何安全问题允许脚本以root身份运行,只要脚本执行了一个确定的,无害的允许的操作,并且如果任何参数的值不能导致该脚本行为不当。

但有一个问题…

始终在命令和文件名中使用完整path。 如果你写的东西像echo Hello world!myrootscript ,有人可能会写一个~/bin/echo scriptmyrootscript会以root myrootscript执行,无论它在myrootscript

/bin/echo "Hoping this will keep you safe" 🙂

默认情况下, wheel组的成员可以以root身份执行任何命令。 这可能是你迄今为止使用sudo方式。

要允许另一个用户,你需要创build一个sudoers规则。 例如:

 mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh 

将允许用户mickey.mouseroot身份运行命令/usr/local/bin/test.sh ,而不需要额外的密码提示。

您应该阅读本文档以获取更多信息。

使用chmod +s <filename>selectsuid位。 这意味着当文件被执行的时候,它会以文件所有者的权限运行(这样就可以将文件变为root)。

然而,对于bash脚本来说,这可能是非常危险的,因为用户find一种方法来改变它,他们很容易获得一个root shell。 确保它不能被除root之外的任何人写入。

Linux不允许你使用脚本,要做到这一点,你必须把它编译成一个程序。 相反,您可以使用sudoers文件(/ etc / sudoers),并添加一行。

<username> ALL = NOPASSWD: /path/to/script

另一种select:你可以在那个脚本上做一个小的setuid C包装器

  • 检查您可能要执行的任何限制(用户列表,时间,系统负载…)
  • 日志/审计执行,如果需要的话
  • 执行脚本

有点像你自己的多个sudo的子集。