我有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 script而myrootscript会以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.mouse以root身份运行命令/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的子集。