如何让脚本以 root 身份执行,无论是谁执行它?
我读过有关 setuid 的信息,但我不确定如何做到这一点。
我正在使用 Linux,Ubuntu 12.04 LTS。
答案1
一定要小心:与 setuid 结合的脚本非常危险!
如果您仍想使用 set 执行脚本setuid
,那么您可以编写一个简短的 C 程序作为包装器并setuid
在编译的二进制文件上设置位。
包装器示例:
int main(void) {
setuid(0);
clearenv();
system("/absolute/path/to/your/script.sh");
}
另一个解决方案是使用sudo
(提到)这里):
以 root 身份阻止对脚本的写访问(以及其他访问):
chown root /absolute/path/to/your/script.sh chmod 700 /absolute/path/to/your/script.sh
确认除 root 之外没有人可以替换脚本例如通过修改父文件夹的访问权限:
chown root /absolute/path/to/your/ chmod 755 /绝对/路径/到/你的/
/etc/sudoers
使用以下命令修改 sudo 访问权限visudo
:全部 全部 = (根)NOPASSWD:/absolute/path/to/your/script.sh
有关设置的更多详细信息(例如限制特定用户或组的访问)可以在 sudoers 手册页中找到。
之后,所有用户都可以以 root 身份运行脚本,无需密码:
sudo /absolute/path/to/your/script.sh
这与上面的使用wrapper/setuid解决方案类似。
答案2
最简单、最安全的方法是在文件权限中使用 SETUID 位。这样命令权限将提升为文件所有者权限。
为了防止脚本被编辑,请不要为每个人设置写入位。
答案3
我不知道这是否有用,但是为了使脚本仅以 root 身份运行,您可以在脚本的第一行使用这个 shebang:
#!/bin/su root
答案4
当我搜索这样的片段时偶然发现了这个问题:
[ "$(id -u)" != 0 ] && exec sudo "$0"
将其添加到脚本顶部将以 sudo 开头,并确保它始终以 root 身份运行,从而允许我们以 身份运行脚本./hello.sh
。当然,sudo 仍会要求输入密码,但接受的答案将有助于避免这种情况。