问题描述
我有ubuntu 8.04,我想编写一个bash脚本,它作为root
运行,每个用户都可以运行。
我自己可以做须藤。
我怎么做?
澄清:我不想使用sudo进行操作,因为那样的话,用户将不得不输入密码。我只希望他们以root身份运行脚本,也许是setuid,dunno。
最佳思路
如果这是正常的二进制文件,则可以通过运行setuid
# chmod u+s /path/to/binary
不幸的是,脚本不能设置为setuid。 (您可以,但是将被忽略)。这样做的原因是脚本的第一行告诉OS在哪个解释器下运行脚本。例如,如果您的脚本具有:
#!/bin/bash
您实际上最终会跑步
/bin/bash /path/to/script
显然,您需要将解释器设置为setuid,这将意味着所有脚本都将为setuid。这样不好
您可以通过运行visudo将以下内容放在/etc /sudoers文件中来使用sudo进行此操作。
ALL ALL=NOPASSWD: /path/to/script
现在,任何用户都可以运行
$ sudo /path/to/script
这样,他们无需输入密码即可运行脚本。
还有一种不需要在命令中使用sudo的替代方法,它需要创建一个小的setuided二进制文件来执行脚本,但是每增加一个setuid二进制文件都会增加另一个潜在的安全问题。
次佳思路
我需要在/etc /sudoers的末尾插入该行:ALL ALL = NOPASSWD: <filename>
显然,以后的%admin ALL=(ALL) ALL
覆盖要求管理员用户输入密码。
只要脚本执行了确定的,无害的,允许的操作,并且如果任何参数的值都不会导致脚本行为异常,则允许该脚本以root用户身份运行不会有安全问题。
但是有一个陷阱…
始终在命令和文件名中使用完整路径。如果您在myrootscript
中编写类似echo Hello world!
的内容,则可能有人会编写~/bin/echo script
,myrootscript
会以root身份执行。
/bin/echo "Hoping this will keep you safe"
🙂